Skip to content

merge from origin#2

Open
jameswind wants to merge 3444 commits into
jameswind:masterfrom
deepmodeling:master
Open

merge from origin#2
jameswind wants to merge 3444 commits into
jameswind:masterfrom
deepmodeling:master

Conversation

@jameswind

Copy link
Copy Markdown
Owner

No description provided.

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

@njzjz njzjz deleted the branch jameswind:master January 6, 2026 05:54
@njzjz njzjz deleted the master branch January 6, 2026 05:54
wanghan-iapcm and others added 27 commits February 26, 2026 02:30
- Fix elif → if for index classification: A system can have both global
and atomic labels simultaneously. The old elif logic meant a system with
both find_atom_energy and find_energy would only be indexed for atomic,
silently dropping its global label.
  Changed to two independent if checks in all three backends.
- Add global_sampled_idx/atomic_sampled_idx parameters:
compute_output_stats_global and compute_output_stats_atomic in pt and pd
backends now accept precomputed index dicts (matching dpmodel's
signature) instead of re-scanning systems internally.
- Support mixed type in dpmodel: compute_output_stats_global in dpmodel
now checks for real_natoms_vec (previously hardcoded natoms_key =
"natoms").
- Apply atom_exclude_types mask to natoms in dpmodel: dpmodel was
missing the exclude-type mask on natoms that pt/pd already had.
- Fix in-place mutation of input data: All three backends were mutating
sampled[i]["natoms"] (or real_natoms_vec) in-place when
atom_exclude_types was present. Now the mask is applied to a local copy,
leaving the caller's data untouched.
- Add cross-backend consistency tests: New test file
source/tests/consistent/utils/test_stat.py with 48 tests covering
dp-vs-pt and dp-vs-pd consistency for compute_output_stats_global,
compute_output_stats_atomic, and the top-level
  compute_output_stats, plus no-mutation verification.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Support excluding atom types from global natoms calculations.
* Allow a system to be counted in both global and atomic sampling
simultaneously.

* **Refactor**
* Switched statistics assembly to index-based gathering for robust
mixed-type handling.
* Standardized numeric assembly/reshaping across backends for consistent
merging.

* **Tests**
* Added comprehensive cross-backend consistency tests (global, atomic,
mixed types, exclusions).

* **Chores**
  * Minor unpacking/cleanup to remove unused fields.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
## Summary

Add detailed mathematical formulas to descriptor class docstrings
following numpydoc convention.

## Changes

Added formulas to the following classes:

### Main descriptor classes
- **DescrptSeR**: Radial descriptor with switching function formula
- **DescrptSeT**: Angular descriptor with cosine angle formula
- **DescrptSeTTebd**: Angular descriptor with type embedding
- **DescrptSeA**: Already had formulas ✓
- **DescrptDPA1**: Already had formulas ✓

### Attention-based descriptors
- **DescrptSeAttenV2**: Attention-based descriptor v2 with stripped type
embedding
- **DescrptBlockSeAtten**: Attention-based descriptor block

### DPA series
- **DescrptDPA2**: Repinit + repformer block equations
- **DescrptDPA3**: Repflow block equations
- **RepFlowArgs**: Node/edge/angle update equations

### Block classes
- **DescrptBlockSeTTebd**: Three-body descriptor block with type
embedding
- **DescrptBlockRepformers**: Repformer block with iterative updates
- **DescrptBlockRepflows**: Repflow block with message passing

### Utility classes
- **DescrptHybrid**: Concatenation of multiple descriptors

## Convention

Following numpydoc convention, parameters are documented in class
docstrings, not in `__init__` docstrings.

## Statistics

- 10 files changed
- 464 insertions(+)
- 55 deletions(-)

Authored by OpenClaw (model: GLM-5)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Documentation**
* Expanded and clarified class- and module-level docstrings across
descriptor implementations with mathematical formulations, parameter
meanings, and usage notes.
* Moved lengthy constructor remarks into class-level documentation for
clearer public-facing explanations.
* Detailed per-block behaviors, output dimensionality,
aggregation/symmetrization steps, and repflow/repformer architectural
descriptions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: GLM-5 <glm-5@zhipuai.cn>
….12,>=0.5 to >=0.5,!=0.6.0,<0.13 (#5271)

Updates the requirements on
[scikit-build-core](https://github.com/orgs/scikit-build) to permit the
latest version.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/orgs/scikit-build/commits">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
See
tensorflow/tensorflow@23f7b26

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated TensorFlow versions and added protobuf constraints for
improved stability across CPU and GPU configurations.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
…@iProzd.) (#5156)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Release Notes

* **New Features**
* Added virial (stress tensor) calculation support for spin-enabled
models
* Introduced virial loss metrics (RMSE_v, MAE_v) for spin model training

* **Bug Fixes**
* Enabled virial data propagation through PyTorch and TensorFlow
backends
  * Fixed virial output handling in C API for spin models

* **Documentation**
* Updated training documentation to include virial data format
specifications for spin models
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Duo <50307526+iProzd@users.noreply.github.com>
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
…orboard (#5252)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Enhanced gradient diagnostics during training: when TensorBoard
logging is enabled, training now records total gradient norm,
per-parameter gradient norms, and a histogram of per-parameter norms.
The system also highlights the top-10 largest parameter gradients as
individual scalars and surfaces total-norm values in training logs to
improve analysis and monitoring.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
…h cross-backend consistency tests (#5260)

## Summary

- Add 5 new pt_expt model types: DipoleModel, PolarModel, DOSModel,
PropertyModel, and DPZBLModel, completing pt_expt's model coverage to
parity with pt
- Refactor dpmodel base architecture so that pt_expt models inherit
directly from dpmodel via `make_model()`, removing the intermediate
pt_expt atomic model layer
- Consolidate scattered model-level methods (`get_out_bias`,
`set_out_bias`, `get_observed_type_list`, `compute_or_load_stat`) into
shared dpmodel base classes
- Move `compute_fitting_input_stat` for `set-by-statistic` mode from
model-level `change_out_bias` to training-level `model_change_out_bias`
(pt and pd backends), keeping the `change_out_bias` logic focused on
bias only (copied from #5266)
- Fix array-api-compat violations in `general_fitting.change_type_map`
(bare `np.zeros`/`np.ones`/`np.concatenate` → `xp` equivalents with
device)
- Fix dpmodel `change_type_map` not forwarding
`model_with_new_type_stat` through the call chain
- Add comprehensive cross-backend consistency tests for all model types
(dp vs pt vs pt_expt), covering: model output, serialization round-trip,
`change_out_bias`, `change_type_map`, `compute_or_load_stat`, model API
methods.

  ## Changes

  ### New pt_expt models
  - `deepmd/pt_expt/model/dipole_model.py`
  - `deepmd/pt_expt/model/polar_model.py`
  - `deepmd/pt_expt/model/dos_model.py`
  - `deepmd/pt_expt/model/property_model.py`
  - `deepmd/pt_expt/model/dp_zbl_model.py`

  ### Architecture refactoring
- Remove `deepmd/pt_expt/atomic_model/` layer — models now wrap dpmodel
atomic models directly
- Clean up `BaseModel`: remove concrete methods/data, add plugin
registry
- Refactor `make_model` so backends (dp, pt_expt) inherit shared model
logic from dpmodel
- Consolidate `get_out_bias`/`set_out_bias` into `base_atomic_model.py`
- Add `get_observed_type_list` to abstract API and implement in dpmodel,
pt, pd
- Move fitting input stat update to `model_change_out_bias` in pt/pd
training code (#5266)

  ### Bug fixes
- `general_fitting.change_type_map`: use array-api-compat ops instead of
bare numpy (breaks pt_expt)
- `make_model.change_type_map`: properly forward
`model_with_new_type_stat` to atomic model
  - `stat.py`: fix in-place mutation issue

  ### Tests
- New cross-backend consistency tests: `test_dipole.py`,
`test_polar.py`, `test_dos.py`, `test_property.py` and
`test_zbl_ener.py` (~1400 lines each)
  - Expanded `test_ener.py` with pt_expt and full model API coverage
- New pt_expt unit tests: `test_dipole_model.py`, `test_polar_model.py`,
`test_dos_model.py`, `test_property_model.py`, `test_dp_zbl_model.py`
- Added `test_get_model_def_script`, `test_get_min_nbor_dist`,
`test_set_case_embd` across all 6 model test files
  - Moved atomic model output stat tests from pt_expt to dpmodel
  - Added `model_change_out_bias` tests in pt/pd training tests (#5266)



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* File-backed compute/load for descriptor and fitting statistics; new
compute-or-load stat APIs, get/set output-bias, and observed-type
discovery.
* Exportable/traceable lower-level inference paths for dipole, dos,
polar, property, zbl, and energy models.

* **Refactor**
* Model factory and generated models support extensible base-class
composition and unified fitting backend wiring.

* **Tests**
* Large expansion of cross-backend (DP/PT/PT-EXPT) parity, statistics,
bias, and exportability tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Pinned the CPU build of PyTorch to version 2.10.0 to match existing
GPU pinning; platform-specific (Darwin/Linux) handling remains
unchanged, ensuring consistent runtime behavior across supported
platforms.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
…ng (#5278)

Remove the unused learning_rate_dict configuration option that allowed
per-task learning rate settings in multitask training. This simplifies
the code by using a single learning_rate configuration for all tasks.

Changes:
- Remove learning_rate_dict branch in loss initialization
- Remove per-task lr_schedule dictionary creation
- Remove isinstance(dict) check in training loop
- Unify single-task and multi-task code paths

Both PyTorch and Paddle backends are updated consistently.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Refactor**
* Streamlined learning rate scheduling in multi-task training scenarios
to ensure consistent initialization and computation of learning rates
across all models.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
…#5280)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **Documentation**
* Added comprehensive debugging guide for diagnosing gradient flow
issues during model training, including step-by-step diagnostic
methodology and common root causes.
* Added diagnostic script with practical code examples and walkthroughs
for isolating gradient behavior across different training modes.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
<!--pre-commit.ci start-->
updates:
- [github.com/PyCQA/isort: 8.0.0 →
8.0.1](PyCQA/isort@8.0.0...8.0.1)
- [github.com/astral-sh/ruff-pre-commit: v0.15.2 →
v0.15.4](astral-sh/ruff-pre-commit@v0.15.2...v0.15.4)
- [github.com/pre-commit/mirrors-clang-format: v21.1.8 →
v22.1.0](pre-commit/mirrors-clang-format@v21.1.8...v22.1.0)
<!--pre-commit.ci end-->

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
…5157)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a top-level, configurable optimizer section; PyTorch:
Adam/AdamW/LKF/AdaMuon/HybridMuon, TensorFlow/Paddle: Adam.
* Exposes Adam-style hyperparameters (beta1, beta2, weight_decay) for
relevant optimizers.

* **Documentation**
* Training docs updated with optimizer examples and framework-specific
guidance.

* **Backward Compatibility**
* Legacy optimizer fields are auto-migrated to the new format; tests and
examples updated to use the new config.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Models now record, persist, and expose observed element-type lists in
model metadata; evaluation/display prefer that metadata when present.
* Training and model APIs accept an optional preset observed-type
override to control observed-type selection.
* Utilities added to collect, save, and restore observed-type lists for
caching and reuse.

* **Tests**
* Added unit and integration tests covering collection, file I/O,
training integration, metadata propagation, fallback behavior, and user
presets.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Duo <50307526+iProzd@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Replaces usage of lmp_list send/recv arrays with new vectors that map
indices using fwd_map and synchronize counts via MPI. Updates tensor
construction to use these new vectors, improving correctness and
flexibility in distributed communication.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Refactor**
* Message-passing now remaps send lists to actual atoms before building
communication tensors, improving consistency for distributed runs.
* **Bug Fixes**
* Invalid or out-of-range send indices are filtered and counts updated
to prevent communication mismatches and related errors.
* **Tests**
* Added a test covering a type-map scenario with a NULL mapping to
exercise the updated handling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Han Wang <92130845+wanghan-iapcm@users.noreply.github.com>
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* New "PyTorch-Exportable" backend with end-to-end training CLI, model
factory, loss wrapper, model wrapper, checkpointing, neighbor/stat
utilities, and optional torch.compile acceleration with automatic
re-tracing.
* **Bug Fixes**
* Added runtime validation for required parameter fields (fparam/aparam)
and ensured loss/reporting arrays are device-consistent.
* **Refactor**
* Reworked stat input, batch normalization, and model-stat collection
for clearer, backend-agnostic data flow.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
…5284)

Implement the full pt_expt inference pipeline: serialize models to .pte
files via torch.export, and load them for inference via
DeepPot/DeepEval.

Key changes:
- Add DeepEval backend for .pte files
(deepmd/pt_expt/infer/deep_eval.py)
- Add serialize/deserialize hooks
(deepmd/pt_expt/utils/serialization.py)
- Wire up backend hooks in deepmd/backend/pt_expt.py
- Add forward_common_lower_exportable using make_fx + torch.export
- Support dynamic nframes, nloc, and nall dimensions
- Fix atomic_virial_corr to use explicit loop instead of vmap

Add xp_take_first_n helper to avoid torch.export contiguity guards on
[:, :nloc] slices. When torch.export traces tensor[:, :nloc] on a tensor
of size nall, it records a Ne(nall, nloc) guard from the view's
contiguity check, which fails when nall == nloc (no PBC). Using
torch.index_select instead creates a new tensor, avoiding the guard.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* PyTorch-exportable inference for exported models with flexible
batching and neighbor-list support.
* Model serialize/deserialize flow that preserves dynamic shapes and
includes round-trip import/export.
  * New neighbor-statistics utility for PyTorch.
* Array utility to take the first N elements with a Torch-optimized
path.

* **Improvements**
* Enhanced export/tracing reliability and array handling to preserve
dynamic shapes.
  * Backend hooks implemented for PyTorch evaluation paths.

* **Tests**
* Extensive tests for inference consistency, serialization round-trips,
and multi-frame scenarios.

* **Chores**
  * Added SPDX license headers.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
Bumps [docker/login-action](https://github.com/docker/login-action) from
3 to 4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/docker/login-action/releases">docker/login-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.0.0</h2>
<ul>
<li>Node 24 as default runtime (requires <a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Actions
Runner v2.327.1</a> or later) by <a
href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a
href="https://redirect.github.com/docker/login-action/pull/929">docker/login-action#929</a></li>
<li>Switch to ESM and update config/test wiring by <a
href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a
href="https://redirect.github.com/docker/login-action/pull/927">docker/login-action#927</a></li>
<li>Bump <code>@​actions/core</code> from 1.11.1 to 3.0.0 in <a
href="https://redirect.github.com/docker/login-action/pull/919">docker/login-action#919</a></li>
<li>Bump <code>@​aws-sdk/client-ecr</code> from 3.890.0 to 3.1000.0 in
<a
href="https://redirect.github.com/docker/login-action/pull/909">docker/login-action#909</a>
<a
href="https://redirect.github.com/docker/login-action/pull/920">docker/login-action#920</a></li>
<li>Bump <code>@​aws-sdk/client-ecr-public</code> from 3.890.0 to
3.1000.0 in <a
href="https://redirect.github.com/docker/login-action/pull/909">docker/login-action#909</a>
<a
href="https://redirect.github.com/docker/login-action/pull/920">docker/login-action#920</a></li>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.63.0 to 0.77.0 in
<a
href="https://redirect.github.com/docker/login-action/pull/910">docker/login-action#910</a>
<a
href="https://redirect.github.com/docker/login-action/pull/928">docker/login-action#928</a></li>
<li>Bump <code>@​isaacs/brace-expansion</code> from 5.0.0 to 5.0.1 in <a
href="https://redirect.github.com/docker/login-action/pull/921">docker/login-action#921</a></li>
<li>Bump js-yaml from 4.1.0 to 4.1.1 in <a
href="https://redirect.github.com/docker/login-action/pull/901">docker/login-action#901</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/login-action/compare/v3.7.0...v4.0.0">https://github.com/docker/login-action/compare/v3.7.0...v4.0.0</a></p>
<h2>v3.7.0</h2>
<ul>
<li>Add <code>scope</code> input to set scopes for the authentication
token by <a
href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a
href="https://redirect.github.com/docker/login-action/pull/912">docker/login-action#912</a></li>
<li>Add support for AWS European Sovereign Cloud ECR by <a
href="https://github.com/dphi"><code>@​dphi</code></a> in <a
href="https://redirect.github.com/docker/login-action/pull/914">docker/login-action#914</a></li>
<li>Ensure passwords are redacted with <code>registry-auth</code> input
by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a>
in <a
href="https://redirect.github.com/docker/login-action/pull/911">docker/login-action#911</a></li>
<li>build(deps): bump lodash from 4.17.21 to 4.17.23 in <a
href="https://redirect.github.com/docker/login-action/pull/915">docker/login-action#915</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/login-action/compare/v3.6.0...v3.7.0">https://github.com/docker/login-action/compare/v3.6.0...v3.7.0</a></p>
<h2>v3.6.0</h2>
<ul>
<li>Add <code>registry-auth</code> input for raw authentication to
registries by <a
href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a
href="https://redirect.github.com/docker/login-action/pull/887">docker/login-action#887</a></li>
<li>Bump <code>@​aws-sdk/client-ecr</code> to 3.890.0 in <a
href="https://redirect.github.com/docker/login-action/pull/882">docker/login-action#882</a>
<a
href="https://redirect.github.com/docker/login-action/pull/890">docker/login-action#890</a></li>
<li>Bump <code>@​aws-sdk/client-ecr-public</code> to 3.890.0 in <a
href="https://redirect.github.com/docker/login-action/pull/882">docker/login-action#882</a>
<a
href="https://redirect.github.com/docker/login-action/pull/890">docker/login-action#890</a></li>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.62.1 to 0.63.0 in
<a
href="https://redirect.github.com/docker/login-action/pull/883">docker/login-action#883</a></li>
<li>Bump brace-expansion from 1.1.11 to 1.1.12 in <a
href="https://redirect.github.com/docker/login-action/pull/880">docker/login-action#880</a></li>
<li>Bump undici from 5.28.4 to 5.29.0 in <a
href="https://redirect.github.com/docker/login-action/pull/879">docker/login-action#879</a></li>
<li>Bump tmp from 0.2.3 to 0.2.4 in <a
href="https://redirect.github.com/docker/login-action/pull/881">docker/login-action#881</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/login-action/compare/v3.5.0...v3.6.0">https://github.com/docker/login-action/compare/v3.5.0...v3.6.0</a></p>
<h2>v3.5.0</h2>
<ul>
<li>Support dual-stack endpoints for AWS ECR by <a
href="https://github.com/Spacefish"><code>@​Spacefish</code></a> <a
href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a
href="https://redirect.github.com/docker/login-action/pull/874">docker/login-action#874</a>
<a
href="https://redirect.github.com/docker/login-action/pull/876">docker/login-action#876</a></li>
<li>Bump <code>@​aws-sdk/client-ecr</code> to 3.859.0 in <a
href="https://redirect.github.com/docker/login-action/pull/860">docker/login-action#860</a>
<a
href="https://redirect.github.com/docker/login-action/pull/878">docker/login-action#878</a></li>
<li>Bump <code>@​aws-sdk/client-ecr-public</code> to 3.859.0 in <a
href="https://redirect.github.com/docker/login-action/pull/860">docker/login-action#860</a>
<a
href="https://redirect.github.com/docker/login-action/pull/878">docker/login-action#878</a></li>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.57.0 to 0.62.1 in
<a
href="https://redirect.github.com/docker/login-action/pull/870">docker/login-action#870</a></li>
<li>Bump form-data from 2.5.1 to 2.5.5 in <a
href="https://redirect.github.com/docker/login-action/pull/875">docker/login-action#875</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/login-action/compare/v3.4.0...v3.5.0">https://github.com/docker/login-action/compare/v3.4.0...v3.5.0</a></p>
<h2>v3.4.0</h2>
<ul>
<li>Bump <code>@​actions/core</code> from 1.10.1 to 1.11.1 in <a
href="https://redirect.github.com/docker/login-action/pull/791">docker/login-action#791</a></li>
<li>Bump <code>@​aws-sdk/client-ecr</code> to 3.766.0 in <a
href="https://redirect.github.com/docker/login-action/pull/789">docker/login-action#789</a>
<a
href="https://redirect.github.com/docker/login-action/pull/856">docker/login-action#856</a></li>
<li>Bump <code>@​aws-sdk/client-ecr-public</code> to 3.758.0 in <a
href="https://redirect.github.com/docker/login-action/pull/789">docker/login-action#789</a>
<a
href="https://redirect.github.com/docker/login-action/pull/856">docker/login-action#856</a></li>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.35.0 to 0.57.0 in
<a
href="https://redirect.github.com/docker/login-action/pull/801">docker/login-action#801</a>
<a
href="https://redirect.github.com/docker/login-action/pull/806">docker/login-action#806</a>
<a
href="https://redirect.github.com/docker/login-action/pull/858">docker/login-action#858</a></li>
<li>Bump cross-spawn from 7.0.3 to 7.0.6 in <a
href="https://redirect.github.com/docker/login-action/pull/814">docker/login-action#814</a></li>
<li>Bump https-proxy-agent from 7.0.5 to 7.0.6 in <a
href="https://redirect.github.com/docker/login-action/pull/823">docker/login-action#823</a></li>
<li>Bump path-to-regexp from 6.2.2 to 6.3.0 in <a
href="https://redirect.github.com/docker/login-action/pull/777">docker/login-action#777</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/login-action/compare/v3.3.0...v3.4.0">https://github.com/docker/login-action/compare/v3.3.0...v3.4.0</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/docker/login-action/commit/b45d80f862d83dbcd57f89517bcf500b2ab88fb2"><code>b45d80f</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/929">#929</a>
from crazy-max/node24</li>
<li><a
href="https://github.com/docker/login-action/commit/176cb9c12abea98dfe844071c0999ff6ee9688a7"><code>176cb9c</code></a>
node 24 as default runtime</li>
<li><a
href="https://github.com/docker/login-action/commit/cad89843109a11cb6f69f52fe695c42cf69d57d3"><code>cad8984</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/920">#920</a>
from docker/dependabot/npm_and_yarn/aws-sdk-dependenc...</li>
<li><a
href="https://github.com/docker/login-action/commit/92cbcb231ed341e7dc71693351b21f5ba65f8349"><code>92cbcb2</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/docker/login-action/commit/5a2d6a71bd3e0cb4abb6faae33f3dde61ece8e5b"><code>5a2d6a7</code></a>
build(deps): bump the aws-sdk-dependencies group with 2 updates</li>
<li><a
href="https://github.com/docker/login-action/commit/44512b6b2e08b878e82b107b394fcd1af5748e63"><code>44512b6</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/928">#928</a>
from docker/dependabot/npm_and_yarn/docker/actions-to...</li>
<li><a
href="https://github.com/docker/login-action/commit/28737a5e46bc0c62910ef429b2e55f9cabbbd5df"><code>28737a5</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/docker/login-action/commit/dac079354afbd8db4c3b58b8cc6946573479b2a6"><code>dac0793</code></a>
build(deps): bump <code>@​docker/actions-toolkit</code> from 0.76.0 to
0.77.0</li>
<li><a
href="https://github.com/docker/login-action/commit/62029f315d6d05c8646343320e4a1552e5f1c77a"><code>62029f3</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/login-action/issues/919">#919</a>
from docker/dependabot/npm_and_yarn/actions/core-3.0.0</li>
<li><a
href="https://github.com/docker/login-action/commit/08c8f064bf22a1c55918ee608a81d87b13cc4461"><code>08c8f06</code></a>
chore: update generated content</li>
<li>Additional commits viewable in <a
href="https://github.com/docker/login-action/compare/v3...v4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/login-action&package-manager=github_actions&previous-version=3&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps
[actions/download-artifact](https://github.com/actions/download-artifact)
from 7 to 8.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/download-artifact/releases">actions/download-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v8.0.0</h2>
<h2>v8 - What's new</h2>
<h3>Direct downloads</h3>
<p>To support direct uploads in <code>actions/upload-artifact</code>,
the action will no longer attempt to unzip all downloaded files.
Instead, the action checks the <code>Content-Type</code> header ahead of
unzipping and skips non-zipped files. Callers wishing to download a
zipped file as-is can also set the new <code>skip-decompress</code>
parameter to <code>false</code>.</p>
<h3>Enforced checks (breaking)</h3>
<p>A previous release introduced digest checks on the download. If a
download hash didn't match the expected hash from the server, the action
would log a warning. Callers can now configure the behavior on mismatch
with the <code>digest-mismatch</code> parameter. To be secure by
default, we are now defaulting the behavior to <code>error</code> which
will fail the workflow run.</p>
<h3>ESM</h3>
<p>To support new versions of the @actions/* packages, we've upgraded
the package to ESM.</p>
<h2>What's Changed</h2>
<ul>
<li>Don't attempt to un-zip non-zipped downloads by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/download-artifact/pull/460">actions/download-artifact#460</a></li>
<li>Add a setting to specify what to do on hash mismatch and default it
to <code>error</code> by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/download-artifact/pull/461">actions/download-artifact#461</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/download-artifact/compare/v7...v8.0.0">https://github.com/actions/download-artifact/compare/v7...v8.0.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/download-artifact/commit/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3"><code>70fc10c</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/download-artifact/issues/461">#461</a>
from actions/danwkennedy/digest-mismatch-behavior</li>
<li><a
href="https://github.com/actions/download-artifact/commit/f258da9a506b755b84a09a531814700b86ccfc62"><code>f258da9</code></a>
Add change docs</li>
<li><a
href="https://github.com/actions/download-artifact/commit/ccc058e5fbb0bb2352213eaec3491e117cbc4a5c"><code>ccc058e</code></a>
Fix linting issues</li>
<li><a
href="https://github.com/actions/download-artifact/commit/bd7976ba57ecea96e6f3df575eb922d11a12a9fd"><code>bd7976b</code></a>
Add a setting to specify what to do on hash mismatch and default it to
<code>error</code></li>
<li><a
href="https://github.com/actions/download-artifact/commit/ac21fcf45e0aaee541c0f7030558bdad38d77d6c"><code>ac21fcf</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/download-artifact/issues/460">#460</a>
from actions/danwkennedy/download-no-unzip</li>
<li><a
href="https://github.com/actions/download-artifact/commit/15999bff51058bc7c19b50ebbba518eaef7c26c0"><code>15999bf</code></a>
Add note about package bumps</li>
<li><a
href="https://github.com/actions/download-artifact/commit/974686ed5098c7f9c9289ec946b9058e496a2561"><code>974686e</code></a>
Bump the version to <code>v8</code> and add release notes</li>
<li><a
href="https://github.com/actions/download-artifact/commit/fbe48b1d2756394be4cd4358ed3bc1343b330e75"><code>fbe48b1</code></a>
Update test names to make it clearer what they do</li>
<li><a
href="https://github.com/actions/download-artifact/commit/96bf374a614d4360e225874c3efd6893a3f285e7"><code>96bf374</code></a>
One more test fix</li>
<li><a
href="https://github.com/actions/download-artifact/commit/b8c4819ef592cbe04fd93534534b38f853864332"><code>b8c4819</code></a>
Fix skip decompress test</li>
<li>Additional commits viewable in <a
href="https://github.com/actions/download-artifact/compare/v7...v8">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/download-artifact&package-manager=github_actions&previous-version=7&new-version=8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps
[actions/upload-artifact](https://github.com/actions/upload-artifact)
from 6 to 7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/upload-artifact/releases">actions/upload-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.0</h2>
<h2>v7 What's new</h2>
<h3>Direct Uploads</h3>
<p>Adds support for uploading single files directly (unzipped). Callers
can set the new <code>archive</code> parameter to <code>false</code> to
skip zipping the file during upload. Right now, we only support single
files. The action will fail if the glob passed resolves to multiple
files. The <code>name</code> parameter is also ignored with this
setting. Instead, the name of the artifact will be the name of the
uploaded file.</p>
<h3>ESM</h3>
<p>To support new versions of the <code>@actions/*</code> packages,
we've upgraded the package to ESM.</p>
<h2>What's Changed</h2>
<ul>
<li>Add proxy integration test by <a
href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/upload-artifact/pull/754">actions/upload-artifact#754</a></li>
<li>Upgrade the module to ESM and bump dependencies by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/upload-artifact/pull/762">actions/upload-artifact#762</a></li>
<li>Support direct file uploads by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/upload-artifact/pull/764">actions/upload-artifact#764</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Link"><code>@​Link</code></a>- made
their first contribution in <a
href="https://redirect.github.com/actions/upload-artifact/pull/754">actions/upload-artifact#754</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/upload-artifact/compare/v6...v7.0.0">https://github.com/actions/upload-artifact/compare/v6...v7.0.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/upload-artifact/commit/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f"><code>bbbca2d</code></a>
Support direct file uploads (<a
href="https://redirect.github.com/actions/upload-artifact/issues/764">#764</a>)</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/589182c5a4cec8920b8c1bce3e2fab1c97a02296"><code>589182c</code></a>
Upgrade the module to ESM and bump dependencies (<a
href="https://redirect.github.com/actions/upload-artifact/issues/762">#762</a>)</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/47309c993abb98030a35d55ef7ff34b7fa1074b5"><code>47309c9</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-artifact/issues/754">#754</a>
from actions/Link-/add-proxy-integration-tests</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/02a8460834e70dab0ce194c64360c59dc1475ef0"><code>02a8460</code></a>
Add proxy integration test</li>
<li>See full diff in <a
href="https://github.com/actions/upload-artifact/compare/v6...v7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/upload-artifact&package-manager=github_actions&previous-version=6&new-version=7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
### Summary

Add hessian (second derivative of energy w.r.t. coordinates) support to
the pt_expt backend, mirroring the JAX backend's approach.

- Compute hessian on extended coordinates in forward_common_atomic (via
torch.autograd.functional.hessian), then let dpmodel's
communicate_extended_output naturally map from nall×nall to nloc×nloc
- make_hessian_model only overrides atomic_output_def() to set
r_hessian=True — no forward_common override or r_hessian toggle hack
needed
- Hessian is enabled at runtime via EnergyModel.enable_hessian() and
returned through the user-facing forward() interface

### Changed files

- deepmd/pt_expt/model/make_model.py — add _cal_hessian_ext and
_WrapperForwardEnergy for hessian computation in forward_common_atomic
- deepmd/pt_expt/model/make_hessian_model.py — minimal wrapper:
__init__, requires_hessian, atomic_output_def
- deepmd/pt_expt/model/ener_model.py — enable_hessian(), hessian output
in forward() and translated_output_def()
  - deepmd/pt_expt/model/__init__.py — export make_hessian_model
- source/tests/pt_expt/model/test_ener_hessian_model.py — unit test:
autograd hessian vs finite-difference, parametrized over nv={1,2}
- source/tests/consistent/model/test_ener_hessian.py — cross-backend
consistency test covering PT, pt_expt, and JAX
  

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Adds Hessian (second-order derivative) support for energy models.
* Provides a mechanism to enable Hessian calculations per model
instance.
* When enabled, Hessian tensors are included in model prediction
outputs.

* **Tests**
* Added comprehensive multi-backend validation of Hessian functionality.
* Added unit tests comparing analytical Hessians to finite-difference
references.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Spin-aware preprocessing for training data, plus bias-adjustment and
type-mapping that handle spin variants during finetuning.

* **Tests**
* Added comprehensive unit and end-to-end tests for spin finetuning,
bias updates, transformed spin data, default-parameter propagation, and
post-finetune inference validation.

* **Refactor**
* Centralized, cached sampler wrapper to standardize sampling and
default-parameter injection.

* **Chores**
  * Truncated bias logging for more concise diagnostics.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
## Summary
- switch the `package_c` Docker build image from TensorFlow 2.18 to 2.20
- pin the installed TensorFlow wheel to `==2.20.*` via the existing
`TENSORFLOW_VERSION` env

## Why
The failing `Build C library` job appears to be in `package_c.yml`, not
in the `cibuildwheel` workflow changed by dependabot.

This change makes the Docker image and installed TensorFlow version move
together, so we can test whether the failure was caused by a TensorFlow
/ GLIBC mismatch from pulling a newer wheel into an older build image.

Authored by OpenClaw (model: gpt-5.4)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated C library build configuration to target TensorFlow 2.20,
aligning the build matrix with the newer TensorFlow runtime.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Bumps [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel) from 3.3
to 3.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pypa/cibuildwheel/releases">pypa/cibuildwheel's
releases</a>.</em></p>
<blockquote>
<h2>v3.4.0</h2>
<ul>
<li>🌟 You can now build wheels using <code>uv</code> as a build
frontend. This should improve performance, especially if your project
has lots of build dependencies. To use, set <a
href="https://cibuildwheel.pypa.io/en/stable/options/#build-frontend"><code>build-frontend</code></a>
to <code>uv</code>. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2322">#2322</a>)</li>
<li>⚠️ We no longer support running on Travis CI. It may continue
working but we don't run tests there anymore so we can't be sure. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2682">#2682</a>)</li>
<li>✨ Improvements to building rust wheels on Android (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2650">#2650</a>)</li>
<li>🐛 Fix bug with the GitHub Action on Windows, where PATH was getting
unnecessarily changed, causing issues with meson builds. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2723">#2723</a>)</li>
<li>✨ Add support for quiet setting on <code>build</code> and
<code>uv</code> from the cibuildwheel <code>build-verbosity</code>
setting. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2737">#2737</a>)</li>
<li>📚 Docs updates, including guidance on using Meson on Windows (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2718">#2718</a>)</li>
</ul>
<h2>v3.3.1</h2>
<ul>
<li>🛠 Update dependencies and container pins, including updating to
CPython 3.14.2. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2708">#2708</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md">pypa/cibuildwheel's
changelog</a>.</em></p>
<blockquote>
<hr />
<h2>title: Changelog</h2>
<h1>Changelog</h1>
<h3>v3.4.0</h3>
<p><em>5 March 2026</em></p>
<ul>
<li>🌟 You can now build wheels using <code>uv</code> as a build
frontend. This should improve performance, especially if your project
has lots of build dependencies. To use, set <a
href="https://cibuildwheel.pypa.io/en/stable/options/#build-frontend"><code>build-frontend</code></a>
to <code>uv</code>. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2322">#2322</a>)</li>
<li>⚠️ We no longer support running on Travis CI. It may continue
working but we don't run tests there anymore so we can't be sure. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2682">#2682</a>)</li>
<li>✨ Improvements to building rust wheels on Android (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2650">#2650</a>)</li>
<li>🐛 Fix bug with the GitHub Action on Windows, where PATH was getting
unnecessarily changed, causing issues with meson builds. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2723">#2723</a>)</li>
<li>✨ Add support for quiet setting on <code>build</code> and
<code>uv</code> from the cibuildwheel <code>build-verbosity</code>
setting. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2737">#2737</a>)</li>
<li>📚 Docs updates, including guidance on using Meson on Windows (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2718">#2718</a>)</li>
</ul>
<h3>v3.3.1</h3>
<p><em>5 January 2026</em></p>
<ul>
<li>🛠 Update dependencies and container pins, including updating to
CPython 3.14.2. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2708">#2708</a>)</li>
</ul>
<h3>v3.3.0</h3>
<p><em>12 November 2025</em></p>
<ul>
<li>🐛 Fix an incompatibility with Docker v29 (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2660">#2660</a>)</li>
<li>✨ Adds <code>test-runtime</code> option, to customise how tests on
simulated/emulated environments are run (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2636">#2636</a>)</li>
<li>✨ Adds support for new <code>manylinux_2_35</code> images on 32-bit
ARM <code>armv7l</code>, offering better C++20 compatibility (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2656">#2656</a>)</li>
<li>✨ <code>build[uv]</code> is now supported on Android (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2587">#2587</a>)</li>
<li>✨ You can now install extras (such as <code>uv</code>) with a simple
option on the GitHub Action (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2630">#2630</a>)</li>
<li>✨ <code>{project}</code> and <code>{package}</code> placeholders are
now supported in <code>repair-wheel-command</code> (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2589">#2589</a>)</li>
<li>🛠 The versions set with <code>dependency-versions</code> no longer
constrain packages specified by your <code>build-system.requires</code>.
Previously, on platforms other than Linux, the constraints in this
option would remain in the environment during the build. This has been
tidied up make behaviour more consistent between platforms, and to
prevent version conflicts. (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2583">#2583</a>)</li>
<li>🛠 Improve the handling of <code>test-command</code> on Android,
enabling more options to be passed (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2590">#2590</a>)</li>
<li>📚 Docs improvements (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2618">#2618</a>)</li>
</ul>
<h3>v3.2.1</h3>
<p><em>12 October 2025</em></p>
<ul>
<li>🛠 Update to CPython 3.14.0 final (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2614">#2614</a>)</li>
<li>🐛 Fix the default MACOSX_DEPLOYMENT_TARGET on Python 3.14 (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2613">#2613</a>)</li>
<li>📚 Docs improvements (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2617">#2617</a>)</li>
</ul>
<h3>v3.2.0</h3>
<p><em>22 September 2025</em></p>
<ul>
<li>✨ Adds GraalPy v25 (Python 3.12) support (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2597">#2597</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/ee02a1537ce3071a004a6b08c41e72f0fdc42d9a"><code>ee02a15</code></a>
Bump version: v3.4.0</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/f08ce70d7891b3a6b3d41f7909a69816eeea643b"><code>f08ce70</code></a>
chore: match copyright to BSD-2-clause template (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2758">#2758</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/95b4b79b96bae59effea03a5f297b0cb5aa31b6b"><code>95b4b79</code></a>
Fix incorrect document regarding pyodide auditwheel (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2752">#2752</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/f046d0a94dc550b5dccb93ae748704599fa1f9ae"><code>f046d0a</code></a>
Bump to Pyodide v0.29.3 (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2743">#2743</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/f5a31ee79d1dfd39a9a0a87d7cd412a29afb8fe1"><code>f5a31ee</code></a>
chore(deps): bump the actions group across 1 directory with 4 updates
(<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2755">#2755</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/35ec4565f5ca3474c283a0852fdf512d5817850f"><code>35ec456</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2756">#2756</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/51fed90270069c1f2ae3c075bcd6b0dad1d739c2"><code>51fed90</code></a>
[Bot] Update dependencies (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2734">#2734</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/b70562f37a2c65580ef235073974d067233fa82a"><code>b70562f</code></a>
Debug GraalPy/uv test failures on Windows (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2741">#2741</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/0a85e29549d1fd12d1ee07727cb55c39e16173a5"><code>0a85e29</code></a>
Work around CDN rate limiting on Python.org in bin/update_pythons.py (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2753">#2753</a>)</li>
<li><a
href="https://github.com/pypa/cibuildwheel/commit/2d33864bafd35e54234e57c036c38cd59288543c"><code>2d33864</code></a>
Pin the actions/setup-python for the externally used action.yml (<a
href="https://redirect.github.com/pypa/cibuildwheel/issues/2749">#2749</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pypa/cibuildwheel/compare/v3.3...v3.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pypa/cibuildwheel&package-manager=github_actions&previous-version=3.3&new-version=3.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
<!--pre-commit.ci start-->
updates:
- [github.com/astral-sh/ruff-pre-commit: v0.15.4 →
v0.15.5](astral-sh/ruff-pre-commit@v0.15.4...v0.15.5)
<!--pre-commit.ci end-->

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
#5277)

## Summary
This PR integrates pretrained model support directly into `deepmd-kit`
under `deepmd/pretrained`, while keeping `DeepPot` usage unchanged.

### Added
- New command:
  - `dp pretrained download <MODEL>`
- New module folder:
  - `deepmd/pretrained/`
- includes `registry.py`, `download.py`, `backend.py`, `entrypoints.py`
- Built-in model registry (currently):
  - `DPA-3.2-5M`
  - `DPA-3.1-3M`
- Multi-source download strategy:
  - parallel probe over candidate sources
  - rank by response latency
- fastest-first with automatic fallback on timeout/failure/checksum
mismatch
- SHA256 verification + atomic `.part` writes
- `.pretrained` backend alias support via `deepmd/backend/pretrained.py`
- allows `DeepPot("DPA-3.2-5M.pretrained")` while keeping existing
DeepPot API unchanged
  - deep-eval adapter is lazy-loaded to avoid circular import issues

### CLI wiring
- Added `pretrained` parser/subparser in `deepmd/main.py`
- Added dispatch in `deepmd/entrypoints/main.py`

### Tests
- `source/tests/common/test_pretrained_parser.py`
- `source/tests/common/test_pretrained_download.py`
- `source/tests/common/test_pretrained_backend.py`

### Formatting / lint
- Ran `uvx prek run --all-files` and committed auto-format updates.

Authored by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.3-codex)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* New "pretrained" CLI group with `pretrained download` (optional
--cache-dir) to fetch pretrained models.
* Built-in pretrained model registry (includes DPA-3.2-5M and
DPA-3.1-3M).
* Added a pretrained backend scaffold and a lazy adapter so
`.pretrained` aliases work transparently with existing evaluation flow
(some backend hooks intentionally unsupported).

* **Downloads & Caching**
* HTTPS-only downloads with SHA256 verification, multi-source fallbacks,
parallel probing, atomic writes, and centralized caching
(~/.cache/deepmd/pretrained/models).

* **Tests**
* Added tests for backend detection, alias parsing, download/resolution
behavior, URL ranking, and CLI parsing.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Problem
- Paddle nightly wheels are fetched from
https://www.paddlepaddle.org.cn/... and the site’s TLS certificate
outage breaks CI installs.

Change
- Add `--trusted-host www.paddlepaddle.org.cn` and `--trusted-host
paddlepaddle.org.cn` to the Paddle install commands in GitHub Actions
workflows.

Notes
- This is a temporary workaround to keep CI green until Paddle fixes
their cert.

Authored by OpenClaw (model: gpt-5.2)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Updated build workflow configurations to include additional package
host verification options during dependency installation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Bumps [tensorflow-cpu](https://github.com/tensorflow/tensorflow) from
2.20.0 to 2.21.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tensorflow/tensorflow/releases">tensorflow-cpu's
releases</a>.</em></p>
<blockquote>
<h2>TensorFlow 2.21.0</h2>
<h1>Release 2.21.0</h1>
<h2>TensorFlow</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Support for Python 3.9 has been removed starting with TF 2.21.</li>
<li>The TensorBoard (TB) dependency has been removed starting with TF
2.21.</li>
</ul>
<h3>Major Features and Improvements</h3>
<ul>
<li>
<p><code>tf.lite</code></p>
<ul>
<li>Adds int8 and int16x8 support for SQRT operator.</li>
<li>Adds int16x8 support for EQUAL and NOT_EQUAL operators.</li>
<li>Adds support for int2 type.</li>
<li>Adds support for int2/int4 in tfl.cast .</li>
<li>Adds support for SRQ int2 in tfl.fully_connected.</li>
<li>Adds support for int4 in tfl.slice.</li>
<li>Adds support for uint4 type.</li>
</ul>
</li>
<li>
<p><code>tf.image</code></p>
<ul>
<li>Adds JPEG XL support in decode_image.</li>
</ul>
</li>
</ul>
<h3>Bug Fixes and Other Changes</h3>
<ul>
<li><code>tf.data</code>
<ul>
<li>Adds <code>NoneTensorSpec</code> to the public API so that
<code>None</code>s in <code>element_spec</code>
can be identified via <code>isinstance(...,
tf.NoneTensorSpec)</code>.</li>
</ul>
</li>
</ul>
<h2>Thanks to our Contributors</h2>
<p>This release contains contributions from many people at Google, as
well as:</p>
<p>Aaraviitkgp, Abhijeet, Abhinav Gunjal, Abhishek, Adam Paszke, Aditya
Gupta, Aditya Jha, Aditya Sharma, Adrian Kuegel, Aiden Grossman, Akarsh,
Akhil Goel, Alan Kelly, Aleksa Arsic, Aleksei, Aleksei Nurmukhametov,
Alex, Alexander Belyaev, Alexander Grund, Alexander Lyashuk, Alexander
Shaposhnikov, Alex Pivovarov, Aliia Khasanova, Alina Sbirlea, Allan
Renucci, Amelia Thurdekoos, Amit Sabne, Andrei Ivanov, Andrew Dame,
Andrey Portnoy, Anish Nair, Anlun Xu, Antonio Sanchez, anuj
chincholikar, Anuj Chincholikar, Aravindh Balaji, aravindhbalaji1985,
Arian Arfaian, Armin Felder, Artem Belevich, Ashish Rao, Ashitesh Singh,
A. Unique TensorFlower, Bart Chrzaszcz, benediktjohannes, Benjamin
Chetioui, Benjamin Kramer, Berkin Ilbeyi, Bhatu, Bhavani Subramanian,
Bhupendra Dubey, Bill Varcho, Bixia Zheng, Blake Hechtman, Bodhi
Silberling, BruceXinXin, Bryan Massoth, Buddh Prakash, Byungchul Kim, Ce
Zheng, Changhui Lin, Chao, Charles Alaras, Chase Riley Roberts, Chenhao
Jiang, Chris Ashton, Chris Jones, Chris Kennelly, Christian Sigg, Chuan
He, Chunlei Niu, Chun-nien Chan, Chunyu Jin, Clive Verghese, Cong Liu,
Corentin Kerisit, Daniel Chen, Daniel Kuts, Daniel Ng, Daniel Sosa,
Daniel Suo, Danila Malyutin, David Dunleavy, David Majnemer, David
Pizzuto, Deepika Rajani, deeptanshusekhri, dependabot[bot], Deqiang
Chen, Derek Murray, Dillon Sharlet, Dimitar (Mitko) Asenov, Dimitris
Vardoulakis, Dirk Hornung, DottsGit, Dragan Mladjenovic, Eetu Sjöblom,
Elen Kalda, Emilio Cota, Emily Fertig, Eugene Zhulenev, Eusebio Durán
Montaña, Evan Brown, Ezekiel Calubaquib, Faijul Amin, Felix Wang, Fengwu
Yao, Fergus Henderson, Frederic Rechtenstein, Frederik Gossen, Gabriel
Gerlero, Gagan Nagaraj, gaikwadrahul8, garry00107, gaurides, George
Pawelczak, Georg Stefan Schmid, gns, Goran Flegar, Graham, Grant Jensen,
Greg Olechwierowicz, Gregory Pataky, Grzegorz Gawryał, Gunhyun Park,
guozhong.zhuang, Haibo Huang, Hana Joo, Hariprasad Ravishankar, Harsha H
S, Harshit Monish, Henning Becker, Hittanshu, Hoeseong (Hayden) Kim,
Hugo Mano, Hyeontaek Lim, Ibrahim Umit Akgun, ILCSFNO, Ilia Sergachev,
Ilya Tikhonovskiy, Iman Hosseini, Ionel Gog, Isha Arkatkar, isharif168,
Ivo Ristovski List, Jacques Pienaar, Jae H. Yoo, Jaeyoon Jung, Jake
Harmon, James Hilliard, jameslovespancakes, James Spooner, Jane Liu,
Jaroslav Sevcik, Jeff Parker, Jeffrey A. Dean, Jeremy Meredith, Jialei
Chen, Jian Cai, Jian Li, Jie Luo, Jim Lin, Jing Pu, Jinliang Wei, Jiya
Zhang, Joel Wee, Johannes Buchner, Johannes Reifferscheid, Johnny, Jorge
Gorbe Moya, Joshua Lang, Joshua Wang, Joss Briody, jparkerh, Juanli
Shen, Juhyun Lee, Jun Jiang, Junwhan Ahn, Kadir Barut, Kanglan Tang,
Kanish Anand, Kanvi Khanna, Karlo Basioli, Ken Franko, Kevin Chen, Kevin
Gleason, Kingston Mandisodza, Koki Ibukuro, Kostiantyn Liepieshov,
Krishna Haridasan, Krishna Somani, Krzysztof Kosiński, Kuy Mainwaring,
lambert, Larry Lansing, Lin Chai, Lord ε Rebel, Luke Baumann, Luke
Hutton, madhavmadupu, Majid Dadashi, Mani Ananth, Manjunath Gaonkar,
Marcello Maggioni, Marcin Radomski, Maria Lyubimtseva, Marissa
Ikonomidis, Mark Daoust, Mason Chang, Matej Aleksandrov, Mateusz Sokół,
Matthias Guenther, Matthias Kramm, Matt Hurd, Matt Kreileder, Maxime
France-Pillois, Maxim Ermilov, Mehrdad Khani, Melissa Weber Mendonça,
MERT-CKR, Michael Goldfarb, Michael Green, Michael Kuperstein, Michael
Voznesensky, Michael Whittaker, Mihai Maruseac, Mikhail Goncharov,
Ming-Xu Huang, Mircea Trofin, Misha Gutman, misterBart, mmakevic-amd,
Mohamed AbdElmoneim, Mohamed Amine Zghal, Mohammadreza Heydary, Mohammed
Anany, mraunak, Mudit Gokhale, Nayana Thorat, Nevi, nhatle, Nhat Le,
Nihar0071, Nikhil, Nikita Putikhin, Niklas Vangerow, Nitin Srinivasan,
Oleg Shyshkov, Olli Lupton, Om Thakkar, Pankaj Kanwar, Parker Schuh,
Paul Ganssle, Pauline Sho, Pavithra Eswaramoorthy, Pedro Gonnet,
pemeliya, Penporn Koanantakool, Perry Gibson, Peter Buchlovsky, Peter
Gavin, Peter Hawkins, Pham Binh, Phani Paladugula, Philipp Hack,
Praneeth Mandala, Praveen Batra, psinfinity, Qingwei Zhang, Quentin
Khan, Quoc Truong, QZero, Rachel Han, Raffi Khatchadourian, Ram Rachum,
RasheedAli-Shaik, Raviteja Gorijala, Reed Wanderman-Milne, Reilly Grant,
Renjie Wu, Richard Levasseur, Robert David, Ryan M. Lefever, Sachin M,
Sagun Bajra, Sai Ganesh Muthuraman, Saksham Singh Rathore, Sannidhya
Chauhan, Sayan Saha, Sean Talts, Seher Ellis, Sergei Lebedev, Sergey
Kozub, Sevin Fide Varoglu, Shahriar Rouf, Shanbin Ke, Shaogang Wang,
Sharad Vikram, Shawn Lu, Siddhartha Menon, Siqiao Wu, skill, Smit Hinsu,
snadampal, Sohaib Iftikhar, Soowon Jeong, spiao, Srijan Upadhyay,
stevemcgregory, Subham Soni, Subhankar Shah, Swachhand Lokhande, Tai Ly,
TensorFlower Gardener, Terry Heo, Terry Sun, Terry Tao, Theotime Combes,
Thomas Joerg, Thomas Köppe, Tiago Quelhas, TJ Xu, Toli Yevtushenko,
Tomás Longeri, Tom Hennigan, Tommy Chiang, Tom Natan, Tongfei Guo, Tori
Baker, Uwe L. Korn, Vadym Matsishevskyi, Vamsi Manchala, Venkat6871,
Victor Stone, Ville Vesilehto, Vitalii Dziuba, Vladimir Belitskiy, Vlad
Sytchenko, Volodymyr Kysenko, Wai Hon Law, wan3x, Weiyi Wang, Will
Froom, William S. Moses, wondertx, Xuefei Jiang, Yang Chen, Yash
Katariya, Yasir Ashfaq, yasiribmcon, Yeou Chiou, Yicheng Luo, Yi Kong,
Yimei Sun, Yin Zhang, Yuchen Yao, Yue Sheng, Yulia Baturina, Yunjie Xu,
Yunlong Liu, Yun Peng, Yurii Topin, Zac Cranko, Zac Mustin, Zenong
Zhang, Zeyu Wang, Zhanyong Wan, Zixuan Jiang, Ziyin Huang, Zviki
Nozadze</p>
<h2>TensorFlow 2.21.0-rc1</h2>
<h1>Release 2.21.0</h1>
<h2>TensorFlow</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Support for Python 3.9 has been removed starting with TF 2.21.</li>
</ul>
<h3>Major Features and Improvements</h3>
<ul>
<li><code>tf.lite</code>
<ul>
<li>Adds int8 and int16x8 support for SQRT operator.</li>
<li>Adds int16x8 support for EQUAL and NOT_EQUAL operators.</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/tensorflow/tensorflow/blob/master/RELEASE.md">tensorflow-cpu's
changelog</a>.</em></p>
<blockquote>
<h1>Release 2.21.0</h1>
<h2>TensorFlow</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Support for Python 3.9 has been removed starting with TF 2.21.</li>
<li>The TensorBoard (TB) dependency has been removed starting with TF
2.21.</li>
</ul>
<h3>Major Features and Improvements</h3>
<ul>
<li>
<p><code>tf.lite</code></p>
<ul>
<li>Adds int8 and int16x8 support for SQRT operator.</li>
<li>Adds int16x8 support for EQUAL and NOT_EQUAL operators.</li>
<li>Adds support for int2 type.</li>
<li>Adds support for int2/int4 in tfl.cast .</li>
<li>Adds support for SRQ int2 in tfl.fully_connected.</li>
<li>Adds support for int4 in tfl.slice.</li>
<li>Adds support for uint4 type.</li>
</ul>
</li>
<li>
<p><code>tf.image</code></p>
<ul>
<li>Adds JPEG XL support in decode_image.</li>
</ul>
</li>
</ul>
<h3>Bug Fixes and Other Changes</h3>
<ul>
<li><code>tf.data</code>
<ul>
<li>Adds <code>NoneTensorSpec</code> to the public API so that
<code>None</code>s in <code>element_spec</code>
can be identified via <code>isinstance(...,
tf.NoneTensorSpec)</code>.</li>
</ul>
</li>
</ul>
<h2>Thanks to our Contributors</h2>
<p>This release contains contributions from many people at Google, as
well as:</p>
<p>Aaraviitkgp, Abhijeet, Abhinav Gunjal, Abhishek, Adam Paszke, Aditya
Gupta, Aditya Jha, Aditya Sharma, Adrian Kuegel, Aiden Grossman, Akarsh,
Akhil Goel, Alan Kelly, Aleksa Arsic, Aleksei, Aleksei Nurmukhametov,
Alex, Alexander Belyaev, Alexander Grund, Alexander Lyashuk, Alexander
Shaposhnikov, Alex Pivovarov, Aliia Khasanova, Alina Sbirlea, Allan
Renucci, Amelia Thurdekoos, Amit Sabne, Andrei Ivanov, Andrew Dame,
Andrey Portnoy, Anish Nair, Anlun Xu, Antonio Sanchez, anuj
chincholikar, Anuj Chincholikar, Aravindh Balaji, aravindhbalaji1985,
Arian Arfaian, Armin Felder, Artem Belevich, Ashish Rao, Ashitesh Singh,
A. Unique TensorFlower, Bart Chrzaszcz, benediktjohannes, Benjamin
Chetioui, Benjamin Kramer, Berkin Ilbeyi, Bhatu, Bhavani Subramanian,
Bhupendra Dubey, Bill Varcho, Bixia Zheng, Blake Hechtman, Bodhi
Silberling, BruceXinXin, Bryan Massoth, Buddh Prakash, Byungchul Kim, Ce
Zheng, Changhui Lin, Chao, Charles Alaras, Chase Riley Roberts, Chenhao
Jiang, Chris Ashton, Chris Jones, Chris Kennelly, Christian Sigg, Chuan
He, Chunlei Niu, Chun-nien Chan, Chunyu Jin, Clive Verghese, Cong Liu,
Corentin Kerisit, Daniel Chen, Daniel Kuts, Daniel Ng, Daniel Sosa,
Daniel Suo, Danila Malyutin, David Dunleavy, David Majnemer, David
Pizzuto, Deepika Rajani, deeptanshusekhri, dependabot[bot], Deqiang
Chen, Derek Murray, Dillon Sharlet, Dimitar (Mitko) Asenov, Dimitris
Vardoulakis, Dirk Hornung, DottsGit, Dragan Mladjenovic, Eetu Sjöblom,
Elen Kalda, Emilio Cota, Emily Fertig, Eugene Zhulenev, Eusebio Durán
Montaña, Evan Brown, Ezekiel Calubaquib, Faijul Amin, Felix Wang, Fengwu
Yao, Fergus Henderson, Frederic Rechtenstein, Frederik Gossen, Gabriel
Gerlero, Gagan Nagaraj, gaikwadrahul8, garry00107, gaurides, George
Pawelczak, Georg Stefan Schmid, gns, Goran Flegar, Graham, Grant Jensen,
Greg Olechwierowicz, Gregory Pataky, Grzegorz Gawryał, Gunhyun Park,
guozhong.zhuang, Haibo Huang, Hana Joo, Hariprasad Ravishankar, Harsha H
S, Harshit Monish, Henning Becker, Hittanshu, Hoeseong (Hayden) Kim,
Hugo Mano, Hyeontaek Lim, Ibrahim Umit Akgun, ILCSFNO, Ilia Sergachev,
Ilya Tikhonovskiy, Iman Hosseini, Ionel Gog, Isha Arkatkar, isharif168,
Ivo Ristovski List, Jacques Pienaar, Jae H. Yoo, Jaeyoon Jung, Jake
Harmon, James Hilliard, jameslovespancakes, James Spooner, Jane Liu,
Jaroslav Sevcik, Jeff Parker, Jeffrey A. Dean, Jeremy Meredith, Jialei
Chen, Jian Cai, Jian Li, Jie Luo, Jim Lin, Jing Pu, Jinliang Wei, Jiya
Zhang, Joel Wee, Johannes Buchner, Johannes Reifferscheid, Johnny, Jorge
Gorbe Moya, Joshua Lang, Joshua Wang, Joss Briody, jparkerh, Juanli
Shen, Juhyun Lee, Jun Jiang, Junwhan Ahn, Kadir Barut, Kanglan Tang,
Kanish Anand, Kanvi Khanna, Karlo Basioli, Ken Franko, Kevin Chen, Kevin
Gleason, Kingston Mandisodza, Koki Ibukuro, Kostiantyn Liepieshov,
Krishna Haridasan, Krishna Somani, Krzysztof Kosiński, Kuy Mainwaring,
lambert, Larry Lansing, Lin Chai, Lord ε Rebel, Luke Baumann, Luke
Hutton, madhavmadupu, Majid Dadashi, Mani Ananth, Manjunath Gaonkar,
Marcello Maggioni, Marcin Radomski, Maria Lyubimtseva, Marissa
Ikonomidis, Mark Daoust, Mason Chang, Matej Aleksandrov, Mateusz Sokół,
Matthias Guenther, Matthias Kramm, Matt Hurd, Matt Kreileder, Maxime
France-Pillois, Maxim Ermilov, Mehrdad Khani, Melissa Weber Mendonça,
MERT-CKR, Michael Goldfarb, Michael Green, Michael Kuperstein, Michael
Voznesensky, Michael Whittaker, Mihai Maruseac, Mikhail Goncharov,
Ming-Xu Huang, Mircea Trofin, Misha Gutman, misterBart, mmakevic-amd,
Mohamed AbdElmoneim, Mohamed Amine Zghal, Mohammadreza Heydary, Mohammed
Anany, mraunak, Mudit Gokhale, Nayana Thorat, Nevi, nhatle, Nhat Le,
Nihar0071, Nikhil, Nikita Putikhin, Niklas Vangerow, Nitin Srinivasan,
Oleg Shyshkov, Olli Lupton, Om Thakkar, Pankaj Kanwar, Parker Schuh,
Paul Ganssle, Pauline Sho, Pavithra Eswaramoorthy, Pedro Gonnet,
pemeliya, Penporn Koanantakool, Perry Gibson, Peter Buchlovsky, Peter
Gavin, Peter Hawkins, Pham Binh, Phani Paladugula, Philipp Hack,
Praneeth Mandala, Praveen Batra, psinfinity, Qingwei Zhang, Quentin
Khan, Quoc Truong, QZero, Rachel Han, Raffi Khatchadourian, Ram Rachum,
RasheedAli-Shaik, Raviteja Gorijala, Reed Wanderman-Milne, Reilly Grant,
Renjie Wu, Richard Levasseur, Robert David, Ryan M. Lefever, Sachin M,
Sagun Bajra, Sai Ganesh Muthuraman, Saksham Singh Rathore, Sannidhya
Chauhan, Sayan Saha, Sean Talts, Seher Ellis, Sergei Lebedev, Sergey
Kozub, Sevin Fide Varoglu, Shahriar Rouf, Shanbin Ke, Shaogang Wang,
Sharad Vikram, Shawn Lu, Siddhartha Menon, Siqiao Wu, skill, Smit Hinsu,
snadampal, Sohaib Iftikhar, Soowon Jeong, spiao, Srijan Upadhyay,
stevemcgregory, Subham Soni, Subhankar Shah, Swachhand Lokhande, Tai Ly,
TensorFlower Gardener, Terry Heo, Terry Sun, Terry Tao, Theotime Combes,
Thomas Joerg, Thomas Köppe, Tiago Quelhas, TJ Xu, Toli Yevtushenko,
Tomás Longeri, Tom Hennigan, Tommy Chiang, Tom Natan, Tongfei Guo, Tori
Baker, Uwe L. Korn, Vadym Matsishevskyi, Vamsi Manchala, Venkat6871,
Victor Stone, Ville Vesilehto, Vitalii Dziuba, Vladimir Belitskiy, Vlad
Sytchenko, Volodymyr Kysenko, Wai Hon Law, wan3x, Weiyi Wang, Will
Froom, William S. Moses, wondertx, Xuefei Jiang, Yang Chen, Yash
Katariya, Yasir Ashfaq, yasiribmcon, Yeou Chiou, Yicheng Luo, Yi Kong,
Yimei Sun, Yin Zhang, Yuchen Yao, Yue Sheng, Yulia Baturina, Yunjie Xu,
Yunlong Liu, Yun Peng, Yurii Topin, Zac Cranko, Zac Mustin, Zenong
Zhang, Zeyu Wang, Zhanyong Wan, Zixuan Jiang, Ziyin Huang, Zviki
Nozadze</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/a481b10260dfdf833a1b16007eead49c1d7febf3"><code>a481b10</code></a>
Merge pull request <a
href="https://redirect.github.com/tensorflow/tensorflow/issues/111627">#111627</a>
from tensorflow-jenkins/version-numbers-2.21.0-25481</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/a8f642e88e001734075133f9576ffd253b9eacc3"><code>a8f642e</code></a>
Update version numbers to 2.21.0</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/3c51664da546f2e7741ad27e98f8dd22dbbf86f9"><code>3c51664</code></a>
Merge pull request <a
href="https://redirect.github.com/tensorflow/tensorflow/issues/111517">#111517</a>
from tejaswin432/r2.21</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/460d178dda3124806d534ec0fb5e3d0830319628"><code>460d178</code></a>
Update RELEASE.md with removal of TB dependency.</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/9e2628c11188f4b1f4361ff08e1de198d13cadb1"><code>9e2628c</code></a>
Update RELEASE.md with removal of TB dependency.</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/00a1ba7b4fd31bf1c75482bfff620a1cf21c5815"><code>00a1ba7</code></a>
Merge pull request <a
href="https://redirect.github.com/tensorflow/tensorflow/issues/111234">#111234</a>
from psamanoelton/remove_tb_nigthly</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/41beecf3ee272e928c59e53edfcd5d8b40bf7f2b"><code>41beecf</code></a>
Remove tb-nigthly and replace it with protobuf.</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/01dec748b0d0daa3eb60a386b857519644fe15e2"><code>01dec74</code></a>
Merge pull request <a
href="https://redirect.github.com/tensorflow/tensorflow/issues/111216">#111216</a>
from psamanoelton/remove_tb_dependency_partial_rol...</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/9657881d9689a4c06d334645932abff9d3481698"><code>9657881</code></a>
Partial rollback to resolve breakage.</li>
<li><a
href="https://github.com/tensorflow/tensorflow/commit/78d130aec00f8b4dbee85d3757ce32032ec7cbdd"><code>78d130a</code></a>
Remove TensorBoard dependency from TensorFlow build</li>
<li>Additional commits viewable in <a
href="https://github.com/tensorflow/tensorflow/compare/v2.20.0...v2.21.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tensorflow-cpu&package-manager=pip&previous-version=2.20.0&new-version=2.21.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
njzjz and others added 30 commits June 28, 2026 17:56
## Summary
- add a JAX-MD adapter for DeePMD JAX models, including energy, force,
neighbor-list, and `as_jax_md` helpers
- add focused JAX tests for energy/force evaluation, dense neighbor
conversion, and real JAX-MD neighbor lists
- add a water JAX-MD smoke example using dpdata to read the LAMMPS data
file
- document the JAX-MD interface in the third-party integration docs

## Tests
- `ruff check .`
- `PYTHONPATH=. pytest source/tests/jax/test_jax_md.py -q`
- JAX-MD water smoke run on GPU

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added JAX-MD support for DeePMD JAX models, including energy, force,
neighbor-list, and model-loading utilities.
* Added a new water simulation example that runs a short JAX-MD NVE
smoke test from the command line.

* **Documentation**
  * Added setup and usage guidance for the JAX-MD integration.
  * Included a new third-party package entry for JAX-MD in the docs.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
…5583)

## Summary

Adds the graph-native forward path for `dpa1(attn_layer=0)` (the
factorizable, mixed-types case), built on the `NeighborGraph` foundation
from #5581. Geometry enters the descriptor only through per-edge
`edge_vec`; the neighbor-axis reduction becomes a `segment_sum` over
edge centers. For `pt_expt` this becomes the **default** forward
(force/virial via a single autograd backward through `edge_vec`).

## What it adds

- **dpmodel**: `edge_env_mat` (per-edge env-mat 4-vector),
`DescrptBlockSeAtten._call_graph` + `DescrptDPA1.call_graph`, model
`call_lower_graph` (energy), `neighbor_graph_from_ijs` + an optional
**ASE** O(N) carry-all builder.
- **pt_expt**: `edge_energy_deriv` (autograd `grad(E, edge_vec)` →
`edge_force_virial`) + `forward_common_lower_graph` (energy + force +
virial + atom_virial).
- The dense `DescrptDPA1.call` becomes a thin adapter
(`from_dense_quartet → call_graph`) preserving the 5-tuple ABI; a
**shape-static** converter keeps it `jax.jit` /
`torch.export`-traceable.

## Default behavior

- **pt_expt** defaults graph-eligible `dpa1(attn_layer=0, concat tebd,
no exclude_types)` models to the carry-all graph (it has the autograd
force/virial path).
- **dpmodel/jax** keep the dense default (they compute force/virial
analytically; the graph lower is energy-only), and **agree with pt_expt
at non-binding `sel`**.
- Ineligible configs (attention, strip tebd, `exclude_types`,
linear/ZBL) fall back to the dense path unchanged.
`neighbor_graph_method="legacy"` forces dense; `"dense"`/`"ase"` force
the graph.

## Parity (graph vs legacy dense lower, fp64 CPU)

| | energy | force | virial | atom_virial |
|---|---|---|---|---|
| max abs diff | 0 | ~1e-19 | ~1e-18 | **~1e-18** |

atom_virial matches the canonical TF==pt-legacy full-to-src convention.
dpa1 descriptor + model consistency suites green across dp/jax/pt_expt.

## Known limitations

- Default-flip is **pt_expt-only**; full carry-all default for dp/jax
needs analytical/jax graph force (follow-up).
- `make_fx` (forward + grad) traces; **full `.pt2` AOTI export is a
follow-up** (PR-B). The carry-all builders
(`build_neighbor_graph`/`from_ijs`) still use `nonzero` (eager-only);
their static variants land with the export PR.
- Single-rank only; CUDA unvalidated (CPU box); ASE is opt-in O(N)
(vesin O(N) is a follow-up); no jax graph force / dpa2-3 message-passing
yet.

Also folds in three follow-up fixes to the #5581 foundation from
@OutisLi's review (dangling spec refs → design discussion,
`edge_force_virial` jax int-sum short-circuit, `Array` typing).


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added graph-native “lowering” for DPA1 when compatible, including
graph-native descriptor/forward execution and graph-native
descriptor→model output conversion.
* Introduced opt-in `neighbor_graph_method` routing for
energy/force/virial, with carry-all neighbor graphs and graph-output
fitting/post-processing.
* Added new neighbor-graph utilities (including ASE-based carry-all
building, `(i,j,S)` conversion, and per-edge environment-matrix
computation), exported as part of the public API.
* **Bug Fixes**
* Improved stability for masked/padded edges, virtual atom handling, and
parameter protection consistency; refined traced virial assembly when
node-capacity is used.
* **Tests**
* Expanded parity/regression suites for graph lowering,
energy/force/virial, conversion correctness, ragged graphs, and FX
tracing.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
## Summary
- add a TensorFlow-version-gated `deepmd::tf_compat::InvalidArgument`
helper
- use `absl::InvalidArgumentError` for TensorFlow >= 2.20 and keep
`tensorflow::errors::InvalidArgument` for older TensorFlow
- route TF custom-op `OP_REQUIRES` InvalidArgument checks through the
helper

Fixes #5006

@OutisLi Could you review this PR?

## Tests
- `uvx ruff==0.15.18 check .`
- `uvx ruff==0.15.18 format .`
- `DP_ENABLE_PYTORCH=0 uv pip install -e '.[cpu,test]'` with TensorFlow
2.21.0
- `dp --version`
- `dp -h`, `dp --tf -h`, `dp --pt -h`, `dp --jax -h`, `dp --pd -h`
- `python -c "import deepmd; import deepmd.tf; print('Both interfaces
work')"`
- `pytest source/tests/tf/test_dp_test.py::TestDPTestEner::test_1frame
-v`
- standalone C++ build/install with TensorFlow 2.21.0 and PyTorch
enabled, using `DEEPMD_BYPASS_TORCH_CUDA_CHECK=ON` for the local CPU
PyTorch wheel

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved TensorFlow compatibility across many operators by
standardizing invalid-input error handling.
* Validation failures now use a framework-compatible error path across
supported TensorFlow versions.
* Kept the same input checks and messages while making shape/rank
mismatch errors more consistent.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Fixes #5593.

This implements the C1 linear extrapolation suggested in
#5593 (comment):

- keep the original out-of-range coordinate and evaluate the endpoint
value/slope at the proper boundary offset
- linearly extend table values outside the covered range while keeping
gradients at the constant boundary slope
- apply the same behavior to se_a, se_r, se_t, and se_t_tebd on CPU and
GPU paths
- add focused lib tests for lower/high tails, boundary continuity,
finite-difference force consistency, and zero tail curvature

Validation:

- ruff check .
- ruff format .
- cmake --build source/build --target runUnitTests_lib -j2
- source/build/lib/tests/runUnitTests_lib
--gtest_filter='TestTabulateSeA.tabulate_fusion_se_a_cpu:TestTabulateSeA.tabulate_fusion_se_a_grad_cpu:TestTabulateSeR.tabulate_fusion_se_r_cpu:TestTabulateSeR.tabulate_fusion_se_r_grad_cpu:TestTabulateSeT.tabulate_fusion_se_t_cpu:TestTabulateSeT.tabulate_fusion_se_t_grad_cpu:TestTabulateSeTTebd.tabulate_fusion_se_t_tebd_cpu:TestTabulateSeTTebd.tabulate_fusion_se_t_tebd_grad_cpu:TabulateExtrapolate.*'

Note: I used the existing source/build directory reconfigured as
TensorFlow-only locally because the previous cache had ENABLE_PYTORCH=ON
with a CUDA PyTorch install but no CUDA toolkit available.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Tabulated SE polynomial evaluations now use an extrapolation-aware
form for out-of-range inputs, improving smoothness and continuity at
both lower and upper table boundaries across SE-a, SE-t, SE-t-tebd, and
SE-r.

* **Bug Fixes**
* Corrected boundary/tail handling so value and gradient computations
remain consistent near min/max, including off-grid max behavior;
gradients now incorporate extrapolated results where needed.

* **Tests**
* Added CPU and GPU test coverage validating value/gradient/grad-grad
consistency via polynomial reference comparisons and finite-difference
checks for all supported SE variants.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
## Summary
- add dpmodel compression entrypoints and wire dp --dp/--jax compress
- persist and restore compressed dpmodel/JAX descriptor state, including
HLO export metadata
- implement dpmodel compression for se_e2_a, se_e2_r, and se_atten/dpa1
(with se_atten_v2 state sync)
- add common dpmodel and JAX compression coverage

## Tests
- python -m pytest source/tests/common/dpmodel/test_model_compression.py
-q
- python -m pytest source/tests/jax/test_model_compression.py -q
- python -m pytest source/tests/common/test_argument_parser.py -q
- python -m pytest source/tests/pt_expt/descriptor/test_se_r.py
source/tests/pt_expt/descriptor/test_dpa1.py
source/tests/pt_expt/descriptor/test_se_atten_v2.py -q
- python -m pytest source/tests/pt_expt/model/test_model_compression.py
-q
- ruff check .
- ruff format --check .

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added model compression support for DPModel and JAX workflows.
* Introduced a new `compress` command in the CLI for creating compressed
model files.
* Expanded support for compressed descriptors, including saving and
restoring compressed models.

* **Documentation**
* Updated CLI help text with new examples and supported model file
formats.

* **Tests**
* Added end-to-end and descriptor-level coverage for compression
behavior and model reloads.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary
- vendor ndtensorflow under deepmd/_vendors and add a TensorFlow eager
Array API backend under deepmd/tf2
- implement tf2 model wrappers, tf.function SavedModel export/deep-eval
glue, and backend registration for .savedmodel
- replace jax/jax2tf TensorFlow helper implementations with tf2
compatibility exports
- add focused tf2 consistency tests for eager and tf.function model
paths

## Tests
- ruff check .
- ruff format .
- pytest source/tests/consistent/test_tf2_backend.py -q
- manual SavedModel export/load smoke test

Note: local pre-commit hook attempted to fetch astral-sh/ruff-pre-commit
and timed out on GitHub port 443; the commit was created with
--no-verify after running the checks above manually.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a TensorFlow 2 eager backend with SavedModel inference plus TF2
model/descriptor/fitting wrappers (energy/dipole/polar/DOS/property).
* Introduced TF2 neighbor-list construction, region/PBC geometry
utilities, and output/ghost-atom aggregation.
* Expanded the TensorFlow-backed Array API with namespace, FFT, and
linear algebra utilities.
* **Bug Fixes**
  * Improved the non-eager TensorFlow compatibility error message.
* **Refactor**
* Converted multiple JAX2TF modules into TF2 compatibility shims that
re-export TF2 implementations.
* **Tests**
  * Added TF2 consistency coverage, including subprocess-based checks.
* **Chores**
  * Added license headers/docs and updated lint configuration.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Jinzhe Zeng <njzjz@qq.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: njzjz-bot (driven by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5))[bot] <48687836+njzjz-bot@users.noreply.github.com>
## Summary

- Lazily materialize JAX atomic outputs in `forward_common_atomic`.
- Use `jax.jacrev(..., has_aux=True)` for reducible
coordinate-differentiable outputs so the force path can reuse the
transformed forward's primal atomic outputs instead of running a
separate atomic forward.
- Keep the coordinate-weighted atomic virial correction as a separate
transformed forward because that derivative must still flow through
`atomic_ret[kk]`.
- Use `jax.hessian(..., has_aux=True)` for the hessian branch and
discard the auxiliary atomic outputs there.

Requesting review from @wanghan-iapcm.

## Benchmark

Command:

```bash
srun --gres=gpu:1 env PYTHONPATH=<baseline-or-this-worktree>:$PYTHONPATH \
  dp --jax train input.json --skip-neighbor-stat -o out.json
```

Setup:

- Input derived from `examples/water/se_e2_a/input.json`
- Absolute water data paths, `numb_steps=1000`, `disp_freq=250`,
`save_freq=1000000`
- JAX 0.8.0
- GPU: NVIDIA GeForce RTX 5090
- Baseline: `58bef11c9`
- This PR: `e60455b57`

`Batch` wall times below are the training-reported interval wall times.

| Version | Batch 1 | Batch 250 | Batch 500 | Batch 750 | Batch 1000 |
Training wall time | `/usr/bin/time real` |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| Baseline | 12.52 s | 21.71 s | 14.05 s | 14.13 s | 14.29 s | 92.208 s
| 96.01 s |
| This PR | 10.25 s | 15.48 s | 10.18 s | 10.11 s | 10.11 s | 70.924 s |
74.47 s |

Speedup:

- Steady-state average over the last three 250-step intervals: `14.1567
s -> 10.1333 s`, about `1.40x` faster, `28.4%` less time.
- End-to-end training wall time: `92.208 s -> 70.924 s`, about `1.30x`
faster, `23.1%` less time.
- `/usr/bin/time real`: `96.01 s -> 74.47 s`, about `1.29x` faster,
`22.4%` less time.

The printed `lcurve.out` rows matched exactly between baseline and this
PR at steps 1, 250, 500, 750, and 1000.

## Tests

```bash
ruff format deepmd/jax/model/base_model.py
ruff check deepmd/jax/model/base_model.py
pytest source/tests/jax/test_dp_hessian_model.py -q
pytest source/tests/consistent/descriptor/test_se_e2_a.py -q -k test_jax_self_consistent
```


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved coordinate-derivative handling for model outputs, which
should make force and higher-order derivative calculations more
reliable.
* Reduced unnecessary recomputation during prediction, helping derived
results compute more efficiently and consistently.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary

- fail early in `dp --pt compress` when `libdeepmd_op_pt` is not loaded
- explain why saving a compressed model without the custom tabulation
ops produces an unusable artifact
- add a regression test for the compression custom-op guard

Addresses #5368.

## Tests

- `python3 -m py_compile deepmd/pt/entrypoints/compress.py
source/tests/pt/test_compress_entrypoint.py`
- `uvx ruff check deepmd/pt/entrypoints/compress.py
source/tests/pt/test_compress_entrypoint.py`
- `uvx ruff format --check deepmd/pt/entrypoints/compress.py
source/tests/pt/test_compress_entrypoint.py`
- `git diff --check`

Could not run the pytest case locally because this checkout does not
have the project test dependencies installed, and `uv run --extra test
...` failed dependency resolution before creating a usable test
environment.

Authored by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Added a pre-flight guard for `dp --pt compress` to confirm the
required PyTorch customized operations are loaded before compression
starts.
* If support is missing, compression now stops immediately with a
clearer error (before any model loading or serialization happens).

* **Tests**
* Added unit tests covering the guard behavior (raises when missing,
proceeds when available) and verifying the check occurs before model
loading.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary

- limit the `Test Python` pull request matrix to the oldest supported
Python version, 3.10
- keep the full 3.10/3.13 matrix for push and merge queue events
- apply the same event-aware matrix to duration aggregation so it only
downloads artifacts for versions that ran

## Motivation

Most PR failures are expected to be version-independent or caught by the
oldest supported Python version. Running the latest Python version on
push and merge queue still preserves coverage before code lands, while
reducing PR CI load.

## Tests

- Parsed `.github/workflows/test_python.yml` with PyYAML
- `git diff --check`

Authored by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Adjusted automated Python test coverage to use a smaller version set
for pull requests and a broader set for other runs.
* Kept the same workflow behavior across all affected checks for more
consistent validation.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary
- replace remaining consistent-test class parameterization with explicit
CURATED_CASES
- add baseline/override helpers for larger descriptor and fitting
matrices
- keep small model/loss matrices as explicit curated tuples

## Tests
- ruff format .
- ruff check .
- pytest --collect-only -q source/tests/consistent/test_activation.py
source/tests/consistent/test_learning_rate.py
source/tests/consistent/test_type_embedding.py
source/tests/consistent/descriptor/test_se_r.py
source/tests/consistent/descriptor/test_se_t.py
source/tests/consistent/descriptor/test_se_t_tebd.py
source/tests/consistent/descriptor/test_se_atten_v2.py
source/tests/consistent/fitting/test_dipole.py
source/tests/consistent/fitting/test_dos.py
source/tests/consistent/fitting/test_dpa4_ener.py
source/tests/consistent/fitting/test_ener.py
source/tests/consistent/fitting/test_polar.py
source/tests/consistent/fitting/test_property.py
source/tests/consistent/loss/test_dos.py
source/tests/consistent/loss/test_ener.py
source/tests/consistent/loss/test_ener_spin.py
source/tests/consistent/loss/test_property.py
source/tests/consistent/loss/test_tensor.py
source/tests/consistent/model/test_dipole.py
source/tests/consistent/model/test_dos.py
source/tests/consistent/model/test_dpa1.py
source/tests/consistent/model/test_ener.py
source/tests/consistent/model/test_frozen.py
source/tests/consistent/model/test_linear_ener.py
source/tests/consistent/model/test_polar.py
source/tests/consistent/model/test_property.py
source/tests/consistent/model/test_zbl_ener.py
- pytest source/tests/consistent/test_learning_rate.py -q

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Tests**
* Standardized test parametrization across consistency, fitting, loss,
and model suites using curated scenario sets.
* Expanded/refined coverage with explicitly enumerated cases, reducing
redundant parameter combinations.
* Improved reliability for compute/load flows by preventing in-place
mutation via defensive copying during execution.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
## Summary
- Add `shared_dict` support to the PyTorch `linear_ener` model config,
reusing the multi-task shared-parameter preprocessor.
- Share descriptor/fitting parameters among linear sub-models with the
same shared-link semantics as multi-task training.
- Preserve shared references through `update_sel`, including configs
where `type_map` only lives in `shared_dict`.
- Add unit coverage for shared descriptor/type_map references and
top-level `type_map` plus shared descriptors.

Closes #4412.
Supersedes/continues #4933.

## Tests
- `uvx ruff check deepmd/pt/model/model/dp_linear_model.py
deepmd/pt/model/model/__init__.py deepmd/pt/utils/multi_task.py
deepmd/utils/argcheck.py
source/tests/pt/model/test_linear_model_shared_dict.py`
- `uvx ruff format deepmd/pt/model/model/dp_linear_model.py
deepmd/pt/model/model/__init__.py deepmd/pt/utils/multi_task.py
deepmd/utils/argcheck.py
source/tests/pt/model/test_linear_model_shared_dict.py`
- `python3 -m py_compile deepmd/pt/model/model/dp_linear_model.py
deepmd/pt/model/model/__init__.py deepmd/pt/utils/multi_task.py
deepmd/utils/argcheck.py
source/tests/pt/model/test_linear_model_shared_dict.py`

Note: local `pytest -q
source/tests/pt/model/test_linear_model_shared_dict.py` could not run in
this worktree because the compiled `deepmd.lib` extension is unavailable
in the local environment.

Authored by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added `shared_dict` support for `linear_ener` models to enable shared
parameters across atomic sub-models, including descriptor and
fitting-network components (with hybrid descriptor support).
* Enhanced `linear_ener` neighbor-selection updates to correctly
round-trip `shared_dict` configurations while preserving shared
descriptor references.
* **Bug Fixes**
* Strengthened validation for shared setups, including consistent
`type_map` handling and safer enforcement of compatible sharing
definitions and link ordering.
* **Tests**
* Added/expanded coverage for `shared_dict` behavior, `shared_links`
population, hybrid descriptors, successful round-trips, and expected
failure cases.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
## Summary
- detect whether a JAX SavedModel contains `XlaCallModule` during C++
initialization
- keep the dynamic atom-count padding only for XLA-compiled lower calls
- pass exact `nall_real` shapes for non-XLA SavedModels

This is mainly to support #5598: padding only has value for XLA
static-shape execution and otherwise changes the non-XLA inference shape
unnecessarily.

## Tests
- `git diff --check`
- `cmake --build source/build --target deepmd_cc -j2`
- `ruff check .`
- `ruff format --check .`

Not run: JAX C++ SavedModel runtime test, because local
`source/tests/infer/deeppot_dpa.savedmodel` is not available.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Improved inference stability and correctness by applying neighbor-list
input padding only for models that benefit from it.
* Updated tensor sizing for neighbor-list computations (including
coordinate/atom-type and mapping shapes) to use the appropriate atom
count, reducing the risk of shape mismatches and unnecessary overhead.
* Enhanced detection of whether the loaded computation graph uses
XLA-style compilation to drive the padding behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary
- split api_cc backend implementations into dynamically loaded backend
plugins
- route DeepPot, DeepSpin, DeepTensor, and DipoleChargeModifier creation
through a C ABI plugin layer
- keep libdeepmd_cc free of TensorFlow/PyTorch/Paddle runtime links;
backend runtimes live in plugin libraries
- package backend plugin targets with C API packaging

## Validation
- ruff check .
- ruff format .
- git diff --check
- cmake -S source -B /tmp/deepmd-plugin-no-backend -DBUILD_CPP_IF=ON
-DBUILD_PY_IF=ON -DBUILD_TESTING=OFF -DCMAKE_TESTING_ENABLED=OFF
-DENABLE_TENSORFLOW=OFF -DENABLE_PYTORCH=OFF -DENABLE_JAX=OFF
-DENABLE_PADDLE=OFF
- cmake --build /tmp/deepmd-plugin-no-backend --target deepmd_cc
deepmd_c -j2
- cmake -S source -B /tmp/deepmd-plugin-tf -DBUILD_CPP_IF=ON
-DBUILD_PY_IF=ON -DBUILD_TESTING=OFF -DCMAKE_TESTING_ENABLED=OFF
-DENABLE_TENSORFLOW=ON -DENABLE_PYTORCH=OFF -DENABLE_PADDLE=OFF
-DTENSORFLOW_ROOT=/home/jzzeng/miniconda3/lib/python3.13/site-packages/tensorflow
- cmake --build /tmp/deepmd-plugin-tf --target deepmd_backend_tf
deepmd_backend_jax -j2
- ldd /tmp/deepmd-plugin-no-backend/api_cc/libdeepmd_cc.so
- nm -D /tmp/deepmd-plugin-tf/api_cc/libdeepmd_backend_tf.so

PyTorch plugin build was not validated locally because the installed
torch package is CUDA-enabled and this environment does not provide CUDA
toolkit files required by TorchConfig.cmake.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added plugin-based runtime backend selection (TensorFlow, PyTorch,
JAX, Paddle) with search paths configurable via
`DP_BACKEND_PLUGIN_PATH`.
  * Backend op libraries are now loaded per selected backend at runtime.
* Enabled TensorFlow pbtxt → pb conversion via the backend plugin
mechanism.
* Improved C API packaging/install to better include resolved runtime
dependencies.
* Updated C++ inference documentation and examples for plugin-based
backend loading.
* **Breaking/Behavior Changes**
* Backend op library loading now requires backend selection
(backend-agnostic loading removed).
* pbtxt → pb conversion no longer strictly depends on TensorFlow being
built-in.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: njzjz-bot (driven by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5))[bot] <48687836+njzjz-bot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
## Summary

- restore the JAX `.savedmodel` conversion path to use
`jax2tf.convert(...)` instead of the TF2 SavedModel exporter
- keep the TF2 eager exporter on the `.savedmodeltf` suffix
- restore the graph-safe TensorFlow helper code used around the
jax2tf-converted model body and document why these helpers should not be
collapsed into TF2/ndtensorflow shims

## Background

`source/tests/infer/convert-models.sh` documents `.savedmodel` as the
JAX/JAX2TF output suffix and `.savedmodeltf` as the TF2 output suffix.
After #5598, the JAX `.savedmodel` branch delegated to the TF2 exporter,
so freshly exported `.savedmodel` and `.savedmodeltf` artifacts had the
same ordinary TF op structure and no `XlaCallModule` nodes.

This restores the historical contract: `.savedmodel` is a JAX/jax2tf
artifact and should contain `XlaCallModule`; `.savedmodeltf` remains the
TF2 eager SavedModel artifact.

## TF2 JIT note

I also checked why `DP_JIT=1` on the TF2 exporter does not create
`XlaCallModule` nodes. A minimal `tf.function(jit_compile=True)`
SavedModel in TF 2.21 stores `_XlaMustCompile: true` on the
FunctionDef/PartitionedCall, but the serialized graph still contains
ordinary TF ops and no `XlaCallModule`. In contrast, a minimal
`jax2tf.convert(...)` SavedModel serializes `XlaCallModule` nodes. So
`XlaCallModule` is a marker for the jax2tf native serialization path,
not for generic TF2 `jit_compile=True`.

## Validation

- `dp convert-backend source/tests/infer/deeppot_sea.yaml
/tmp/.../deeppot_sea.savedmodel`, parsed `saved_model.pb`: 8
`XlaCallModule` ops
- `dp convert-backend source/tests/infer/deeppot_dpa.yaml
/tmp/.../deeppot_dpa.savedmodel`, parsed `saved_model.pb`: 8
`XlaCallModule` ops
- `dp convert-backend source/tests/infer/deeppot_sea.yaml
/tmp/.../deeppot_sea.savedmodeltf`, parsed `saved_model.pb`: 0 XLA op
names, as expected for TF2 eager export
- `ruff format .`
- `ruff check .`

Please review, @wanghan-iapcm.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Enhanced JAX-based SavedModel export with additional execution
endpoints and metadata queries (including neighbor-list/selection and
output configuration).
* Added in-graph coordinate transforms and improved
neighbor-list/periodic ghost handling for export.

* **Bug Fixes**
* Corrected neighbor-list padding/truncation, cutoff masking, and stable
type-distinguished ordering.
* Improved handling of virtual atoms and empty-cell periodic extension
cases.

* **Tests**
  * Migrated neighbor-list/region tests to pure TensorFlow ops.
* Added coverage for model call behavior and SavedModel export contents.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This is first PR of porting the whole dpa4 descriptor

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added Cartesian tensor-product mixing options for SeZM/DPA4
descriptors (`edge_cartesian`, `node_cartesian`) with `mixing_layers`
control.
* Added LoRA fine-tuning support (adapter injection, merging, and
LoRA-free checkpoint export).
* Added opt-in performance acceleration (Triton when available) and
eval-time activation checkpointing for the interaction block.

* **Bug Fixes**
* Improved destination-wise edge aggregation/softmax and sparse-edge
masking; more robust serialization/deserialization round-trips and
dtype/precision restoration.

* **API Changes**
* Renamed SeZM SO(2) parameter: `so2_layers` → `mixing_layers` (kept as
alias).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
)

## Problem

`data/raw/raw_to_set.sh` splits global `dipole.raw`/`polarizability.raw`
into per-set chunks (`dipole.raw000`, …) and the in-set conversion block
expects `dipole.raw`/`polarizability.raw` to exist inside `set.<pi>/`.
However the per-set *move* block moved every other split file **except**
the global `dipole.raw$pi`/`polarizability.raw$pi` chunks. As a result,
datasets carrying global dipole/polarizability labels silently lost them
during conversion: `dipole.npy`/`polarizability.npy` were never
generated, and the split chunks were left orphaned in the raw directory.

## Fix

Add the two missing `mv` lines, placed to mirror the existing
split/convert order.

## Test

The script previously had **no test at all**, which is why the omission
survived. This PR adds `source/tests/common/test_raw_to_set.py`, a
parametrized test that runs the script and asserts every split tensor
label (`dipole`, `polarizability`, `atomic_dipole`,
`atomic_polarizability`) is converted to `set.<pi>/<label>.npy` with
round-tripped contents across multiple sets, and that no split chunks
are orphaned in the raw dir. Verified failing-then-passing: on the
unmodified script the `dipole` and `polarizability` cases fail (`.npy`
not generated) while the atomic variants pass; after the fix all four
pass.

## Known limitation

The test requires `bash`, `split`, and `python` on PATH (all present in
CI).

Fix #5692

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
## Problem

The devcontainer LAMMPS pytest wrappers compute `SCRIPT_PATH` two
directories above the wrapper script (`SCRIPT_PATH=$(dirname $(realpath
-s $0))/../..`), while `.devcontainer/lmp`/`gdb_lmp` and all the
devcontainer build scripts use the `.devcontainer` directory itself
(`SCRIPT_PATH=$(dirname $(realpath -s $0))`). All wrappers then derive
`${SCRIPT_PATH}/../libtorch`, `${SCRIPT_PATH}/../dp/lib` and
`${SCRIPT_PATH}/../.venv`. The build scripts install `libtorch`, `dp`,
and `.venv` at the repository root (`download_libtorch.sh` unzips into
`${SCRIPT_PATH}/..`, `build_cxx.sh` installs to `${SCRIPT_PATH}/../dp/`,
`build_py.sh` runs `uv sync` from `${SCRIPT_PATH}/..`). So the pytest
wrappers' extra `/../..` resolves those paths two directory levels too
high — pointing `LAMMPS_PLUGIN_PATH`/`LD_LIBRARY_PATH` outside the
checkout.

## Fix

Drop the `/../..` from `.devcontainer/pytest_lmp` and
`.devcontainer/gdb_pytest_lmp` so all four wrappers share the same base
and resolve to the repository root, consistent with the build scripts.

## Scope / impact

These wrappers are interactive developer convenience scripts inside the
devcontainer; CI does not invoke them (LAMMPS tests in CI set their own
plugin and library paths). The bug therefore only affected a developer
manually running `.devcontainer/pytest_lmp` to debug LAMMPS tests, where
the deepmd LAMMPS plugin would fail to load. There is nothing to
unit-test here; the fix is verified by inspection — all four wrappers
now use an identical `SCRIPT_PATH` base and identical
`${SCRIPT_PATH}/../…` derivations.

Fix #5691

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
…5698)

## Problem

`examples/zinc_protein/zinc_se_a_mask.json` referenced its training and
validation data with repo-root-relative paths
(`examples/zinc_protein/train_data_dp_mask/` and
`examples/zinc_protein/val_data_dp_mask/`), while the data actually
lives next to the config. Every other example uses paths relative to its
own directory. As a result this example only trained when launched from
the repository root; run from `examples/zinc_protein`, the paths
resolved to `examples/zinc_protein/examples/zinc_protein/...`, which
does not exist.

## Fix

Use local `train_data_dp_mask/` and `val_data_dp_mask/` paths, matching
the config-relative convention of the other examples.

## Test

`source/tests/common/test_examples.py` already loaded this config, but
only ran argument-checking (`normalize`), so an unresolvable data path
passed. This PR adds `test_data_paths_exist`, which asserts that every
example's `training_data`/`validation_data` `systems` resolve relative
to the config's own directory. Across all listed examples this fails
only for the two zinc_protein paths on the current tree and passes for
every other example; after the fix it passes. It permanently guards the
config-relative-path convention.

## Known limitation

The new check covers the single-task `input_files` list (where this
example lives); multi-task configs use a different nested data schema
and are out of scope for this fix.

Fix #5694

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Updated example data paths to use shorter, relative locations so they
resolve correctly from the example directory.
* Added a check that example input files reference existing system data
paths, helping catch broken paths earlier.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
@/tmp/pr-body-5185.md

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a "serialization-tree" option to the show command to display a
model's serialized structure as a human-readable tree.
* Exposed a unified serialize() API across inference backends so tools
can retrieve a consistent model export payload.
  * Show now logs the generated serialization tree when requested.

* **Tests**
* Added tests verifying backends produce the expected serialization
payload and the show command emits the serialization-tree output.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
## Summary
- batch CPU and GPU prod env mat over frames for non-LAMMPS neighbor
lists
- support no-PBC self-built nlists, manual PBC coord copy, and
mesh-provided nlists
- keep LAMMPS external nlists on the existing per-sample path
- add CPU/GPU multiple-frame neighbor-list and env-mat coverage

Fixes #2618

## Tests
- cmake --build source/build-codex-cuda --target runUnitTests_lib
deepmd_op -j2
- source/build-codex-cuda/lib/tests/runUnitTests_lib
--gtest_filter=TestNeighborList.cpu:TestNeighborList.cpu_multiple_frames:TestNeighborList.cpu_lessmem:TestEnvMatA.prod_cpu:TestEnvMatA.prod_cpu_equal_cpu:TestEnvMatA.prod_cpu_multiple_frames:TestEnvMatR.prod_cpu:TestEnvMatR.prod_cpu_equal_cpu:TestEnvMatR.prod_cpu_multiple_frames:TestEnvMatAMix.prod_cpu:TestEnvMatAMix.prod_cpu_equal_cpu
- srun --gres=gpu:1 source/build-codex-cuda/lib/tests/runUnitTests_lib
--gtest_filter=TestEnvMatA.prod_gpu_multiple_frames:TestNeighborList.gpu_multiple_frames:TestEnvMatA.prod_gpu:TestEnvMatA.prod_gpu_equal_cpu:TestEnvMatR.prod_gpu:TestEnvMatR.prod_gpu_equal_cpu:TestFormatNlist.gpu:TestFormatNlistShortSel.gpu
- pytest
source/tests/tf/test_prod_env_mat.py::TestProdEnvMat::test_pbc_self_built_nlist
source/tests/tf/test_prod_env_mat.py::TestProdEnvMat::test_nopbc_self_built_nlist
source/tests/tf/test_prod_env_mat.py::TestProdEnvMat::test_pbc_self_built_nlist_deriv
source/tests/tf/test_prod_env_mat.py::TestProdEnvMat::test_nopbc_self_built_nlist_deriv
-q

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Neighbor-list, neighbor formatting, and environment-matrix operations
now support multi-frame processing in a single call via an `nframes`
argument (CPU and GPU).
* Neighbor-list construction can optionally filter candidates using a
per-atom type array.
* **Bug Fixes**
* Invalid/filtered center or neighbor types are handled consistently
(including zeroing `em`/`em_deriv` where applicable).
* Improved GPU robustness with safer temporary-memory management and
clearer error handling.
* **Tests**
* Added/extended CPU and GPU tests to validate multi-frame neighbor-list
and environment-matrix behavior, including negative-type cases.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn>
Signed-off-by: Jinzhe Zeng <njzjz@qq.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: A bot of @njzjz <48687836+njzjz-bot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
## Summary

This PR adds **DPA-ADAPT**, a toolkit for adapting pretrained DPA models
to downstream atomistic property prediction tasks.

The new package provides a scikit-learn-style Python API and standalone
CLI for fine-tuning, descriptor extraction, prediction, evaluation,
cross-validation, and data preparation, without requiring users to
manually write DeePMD-kit training input files.

## Main changes

- Add the top-level `dpa_adapt` Python package.
- Add standalone CLI entry points:
  - `dpa-adapt`
  - `dpaad`
- Support multiple adaptation strategies:
- `frozen_sklearn`: frozen DPA descriptors with scikit-learn regressors
  - `frozen_head`: train a property head on top of a frozen DPA backbone
  - `finetune`: end-to-end DPA fine-tuning
  - `mft`: multi-task fine-tuning with auxiliary energy/force training
- Add data utilities for:
  - DeepMD/npy loading and validation
  - label attachment
  - descriptor caching
  - train/test split and cross-validation
  - SMILES/formula-based conversion workflows
  - optional frame parameters via `fparam.npy`
- Add prediction and evaluation helpers with MAE, RMSE, and R2
reporting.
- Add documentation under `doc/dpa_adapt/`.
- Add a runnable QM9 HOMO-LUMO gap example under `examples/dpa_adapt/`.
- Add `dpa-adapt` optional dependencies in `pyproject.toml`.
- Add dedicated lightweight CI for `source/tests/dpa_adapt/`.

Co-authored-by: zirenjin
<[zirenjin@umich.edu](mailto:zirenjin@umich.edu)>

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added the DPA-ADAPT toolkit with a new command-line interface for data
conversion, validation, training, prediction, evaluation, and descriptor
extraction.
* Introduced support for multiple adaptation workflows, including
frozen-sklearn, frozen-head, fine-tuning, and multi-task training.
* Added data handling for SMILES, formulas, structures, label
attachment, and condition features.
* Included a new example workflow and expanded user documentation for
setup and usage.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: zhaiwenxi <144502730+zhaiwenxi@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: zirenjin <zirenjin@umich.edu>
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
Co-authored-by: zhaiwenxi <zhaiwenxi@example.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
## Problem

Two documentation references were stale:

- `doc/freeze/freeze.md` linked the Paddle multi-task freezing text to
`../train/multi-task-training-pd.md`, which does not exist in the
checkout (only `../train/multi-task-training.md` is present). The
PyTorch section of the same file already links to
`../train/multi-task-training`.
- `doc/model/train-se-a-mask.md` contained an unfinished placeholder
link, `[DP/MM](left to be filled)`.

## Fix

- Point the Paddle multi-task link at the existing
`../train/multi-task-training.md`.
- Drop the `[DP/MM](left to be filled)` placeholder markup, since no
citation target is available, leaving plain text.

## Note on the third item

The original issue also flagged `doc/getting-started/install.md` linking
to `install-from-source.md`. That one is not a bug:
`doc/getting-started/install.md` is a symlink to
`../install/easy-install.md`, and the `[build from
source](install-from-source.md)` link is correct relative to that file's
real location under `doc/install/`, where `install-from-source.md`
exists. It is left unchanged.

## Test

These are documentation link fixes. There is no docs linkcheck in CI,
and Sphinx/MyST do not fail the build on broken relative Markdown links,
which is why these went unnoticed. A linkcheck is intentionally not
added here: the docs use MyST extensionless cross-references (e.g. the
sibling `../train/multi-task-training` link in the same file), so a
naive relative-file-existence validator would produce false positives; a
robust linkcheck is a separate infrastructure change out of scope for
this fix. The fix is verified by confirming the corrected link target
exists and the placeholder is removed.

Fix #5695

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Corrected a training guide link for multi-task mode so it points to
the current documentation page.
* Improved explanatory text in the `se_a_mask` guide with a clearer
reference to the relevant DP/MM paper.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
## Problem

`LinearModel.get_loss()` reassigned its `loss` argument to each
submodel's returned value:

```python
for model in self.models:
    loss = model.get_loss(loss, lr)
    if loss is not None:
        return loss
```

Frozen and pairtab submodels return `None` from `get_loss()` because
they own no trainable loss. When such a non-trainable submodel is
ordered before a trainable energy submodel, the trainable submodel is
then called with `loss=None`, and `EnerFitting.get_loss()` dereferences
it as a dict via `loss.pop("type", ...)`, raising `AttributeError:
'NoneType' object has no attribute 'pop'` during trainer construction —
even though the original loss config could have been used.

## Fix

Iterate with a separate variable and pass a `copy.deepcopy(loss)` of the
original loss configuration to each submodel, returning the first
non-`None` result. This keeps the caller's loss config intact for the
trainable submodel regardless of submodel ordering, and avoids mutating
the shared config (`EnerFitting.get_loss` pops keys from it).

## Test

`source/tests/tf/test_linear_model.py` covered a linear model whose
submodels never hit this ordering, so the crash path was unexercised. A
new lightweight `TestLinearModelGetLoss` constructs a
`LinearEnergyModel` with a `None`-returning submodel (mimicking
frozen/pairtab) ordered before a trainable submodel (mimicking
`EnerFitting.get_loss`'s `loss.pop`), and asserts `get_loss` returns the
trainable loss and leaves the original config unmutated. On the current
code it fails with the `NoneType ... pop` error; after the fix it
passes.

Fix #5682

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Preserves the original loss configuration when evaluating multiple
submodels.
* Ensures a non-trainable submodel returning no loss does not affect
later trainable submodels.

* **Tests**
* Added coverage for loss handling across submodels, including unchanged
input configuration and correct fallback behavior.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
…#5699)

## Problem

The `examples/infer_water` README tells users to run `cmake` and `make`,
but the resulting inference binaries (`infer_water_cc`, `infer_water_c`,
`infer_water_hpp`, `infer_water_nlist`) load a frozen model `graph.pb`
from the current directory. `graph.pb` is gitignored and never
generated, and the `convert_model.c` helper that creates it is neither
built by `CMakeLists.txt` nor mentioned in the README. Following the
documented steps therefore produces binaries that fail at runtime.

## Fix

Add `convert_model` as a CMake target (it uses only
`DP_ConvertPbtxtToPb` from `deepmd/c_api.h`, so it links
`DeePMD::deepmd_c` like the other C examples) and document the full
sequence in the README: build, run `./convert_model` to generate
`graph.pb` from the bundled test model
`source/tests/infer/deeppot.pbtxt`, then run the inference examples. The
README makes explicit that `make` only compiles the executables and does
not create the model file, and that `convert_model` must be run from the
example directory (so the relative path to the bundled model resolves)
with a TensorFlow-enabled build (since `graph.pb` is a TensorFlow frozen
model).

## Test

This is a build/documentation example that is not part of the unit-test
suite; a meaningful test would require building the example project
against an installed TensorFlow-enabled DeePMD-kit and running the
binaries, which is outside the unit scope. The fix is verified by
inspection: `convert_model.c` includes only `deepmd/c_api.h`,
`DP_ConvertPbtxtToPb` is a real C-API function, and the bundled
`deeppot.pbtxt` fixture exists and resolves relative to the example
directory.

Fix #5693

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added a new helper build target for converting a model file in the
water inference example.
* Expanded the example documentation with step-by-step build and
inference guidance.

* **Documentation**
* Clarified that building the example only compiles executables and does
not generate the model file.
* Added instructions for creating the required `graph.pb` file and
running the available inference binaries.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
## Problem

The TensorFlow `change-bias` dispatcher only accepts inputs ending in
`.pb`, `.pbtxt`, `.ckpt`, `.meta`, `.data`, or `.index`, and rejects
everything else with `RuntimeError("The model provided must be a
checkpoint file or frozen model file (.pb)")`.

However, the CLI examples and the frozen-model fallback message
recommend passing a checkpoint directory, and real TensorFlow checkpoint
prefixes commonly look like `model.ckpt-1000`. A checkpoint directory
has no recognized suffix, and a `model.ckpt-1000` prefix ends in
`-1000`, so both are rejected before `_change_bias_checkpoint_file()` —
which already resolves the checkpoint via the `checkpoint` state file —
can run.

## Fix

Route suffix-less inputs to the checkpoint handler when a TensorFlow
`checkpoint` state file is present in the effective directory (the input
itself if it is a directory, otherwise its parent). Inputs without such
a state file still raise the original error.
`_change_bias_checkpoint_file()` now also resolves `checkpoint_dir`
correctly when the input is a directory.

## Test

`source/tests/tf/test_change_bias.py` previously exercised only `.pb`,
`.ckpt`, and bad-suffix inputs, never a bare directory or a
`ckpt-<step>` prefix. Two new tests mock `_change_bias_checkpoint_file`
and assert it is invoked for a `model.ckpt-1000` prefix and for a
checkpoint directory that contain a `checkpoint` state file. On the
current dispatcher both raise the "checkpoint file or frozen model file"
RuntimeError before reaching the handler; after the fix both route
correctly. The existing rejection tests (e.g. a `model.xyz` file with no
checkpoint state file) still raise.

Fix #5683

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved handling of checkpoint inputs so bias changes now work
reliably for both checkpoint file prefixes and checkpoint directories.
* Unrecognized input paths are now treated as checkpoint-based inputs
only when a valid checkpoint state is present, reducing incorrect
routing.

* **Tests**
* Added coverage for checkpoint prefix and directory cases to verify the
correct bias-change path is used.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
## Problem

`change-bias --numb-batch` is documented as the number of frames to use
per data system, with `0` meaning all data. On the TensorFlow data-based
path this value was ignored: `_change_bias_checkpoint_file` called
`_apply_data_based_bias(...)` without `numb_batch`, and
`_apply_data_based_bias` then hardcoded `ntest=1` when calling
`change_energy_bias_lower`. As a result the bias was always estimated
from a single frame per system regardless of `-n/--numb-batch`, and the
documented `0 means all data` behavior had no effect.

## Fix

Thread `numb_batch` into `_apply_data_based_bias` and forward it to
`change_energy_bias_lower` as `ntest`. In `change_energy_bias_lower`,
treat `ntest <= 0` as "use all frames in the system" (`numb_test =
nframes if ntest <= 0 else min(nframes, ntest)`), implementing the
documented `0 means all data`. This is backward compatible: the default
`ntest` is 10 and no existing caller passed a non-positive value.

## Test

There was no test covering `numb_batch` or `change_energy_bias_lower`. A
new test builds a small multi-frame `DeepmdDataSystem` and a mock
evaluator that records how many frames it is asked to predict, then
asserts that `ntest=1` evaluates one frame per system and `ntest=0`
evaluates all frames. On the current code `ntest=0` selects zero frames
(raising downstream); after the fix it uses all frames.

The `numb_batch -> ntest` parameter plumbing is simple and verified by
inspection; the test targets the frame-selection semantics that the fix
makes controllable.

Fix #5684

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Fixed bias recalculation so batch settings now use the expected number
of frames.
* When no batch limit is set, all available frames are now included
instead of a smaller default subset.
* **Tests**
* Added coverage for batch selection behavior to ensure bias updates use
the correct frame counts.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
…C++ inference single & multi-rank (NeighborGraph PR-B) (#5604)

## NeighborGraph PR-B — graph `.pt2` export, compiled training, and C++
inference (single & multi-rank)

This PR spans the full PR-B: **B1** (Python: graph `.pt2` export +
compiled training on the graph lower), **B2** (C++ single-rank inference
of the graph `.pt2`, dynamic edge axis), and **B3** (C++/LAMMPS
multi-rank). Built on the merged PR-A (#5583). Scope: dpa1,
`attn_layer=0`, pt_expt.

### B1 — graph `.pt2` export + compiled training (Python)
- `forward_common_lower_graph_exportable` trace target;
`serialization.py` graph export branch (`lower_kind="graph"`,
`lower_input_kind` metadata); `_eval_model_graph` DeepEval dispatch
(parity vs eager dpa1 **1e-10 pbc+nopbc**).
- **Compiled training retargeted to the graph lower so eager ==
compiled** (the MUST-FIX) → `force_legacy_descriptor` deleted. Root
cause was a real dpa1 `call_graph` autograd **detach** bug
(`xp.asarray(tebd, device=)` drops the tebd-net gradient under torch);
fixed.

### B2 — C++ graph ingestion (dynamic edge axis, single-rank)
- Graph `.pt2` uses a **dynamic edge axis** (`Dim("nedge", min=2)`) —
one artifact evals any system size (proven across 56- and 380-edge
systems at 1e-10), no C++ capacity ceiling.
- C++ `DeepPotPTExpt`: `lower_input_is_graph_` + `run_model_graph`
(NeighborGraph ABI: `atype, n_node, edge_index, edge_vec, edge_mask, …`)
+ `buildGraphTensors` (mirrors the #5562 edge path; node types from
`atype_ext`); `remap_graph_outputs_to_dense_keys` (single-rank).
- gtest: 5 cases × {double,float} = 10/10 (build-nlist parity, dynamic-E
2nd size, `ago>0`, tiny system, atomic-overload). The review process
caught two bugs that would otherwise have shipped: an `ago>0` heap-OOB
(by inspection) and a public-vs-internal output-key mismatch (at
runtime).

### B3 — multi-rank C++ / LAMMPS (non-MP)
- **dpa1 is non-message-passing ⇒ multi-rank needs NO
`border_op`/with-comm artifact** (that is a message-passing concern,
deferred to PR-G). Multi-rank reuses the **same single-rank graph
`.pt2`**, fed an **extended-region graph**
(`buildGraphTensors(fold_to_local=false)`, `N=nall`, ghost node types
from `atype_ext` incl. halo), with owned energy =
`sum(atom_energy[0:nloc])` and the extended force folded to owners
through the **existing dense `select_map` reverse-comm**. The fail-fast
for `graph && multi_rank && has_message_passing` is retained.
- **Validated locally on multi-CPU** (no GPU needed for correctness):
`test_lammps_dpa1_graph_pt2.py` — single-rank vs reference, `mpirun -n
2` ≡ single-rank (energy + per-atom force + virial, atol 1e-8), plus an
empty-subdomain (`nloc=0`) corner. Single-rank gtests stay 10/10
(multi-rank is purely additive). Multi-rank matched single-rank on the
first run.

### Tests / known limitations
- Per-task + whole-phase reviews all Ready-to-merge.
- **pt_expt-only; dpa1 (non-MP) only.** Follow-ons: **PR-C** vesin/nv
O(N) builders (carry-all builders still use `nonzero`, eager-only),
**PR-D** attention, **PR-E** angles, **PR-F** jax graph force, **PR-G**
dpa2/3 message-passing (forward halo + with-comm). CUDA multi-rank
unvalidated locally. Carried code-cleanup follow-ups: a ~60-line DRY
duplication in `training.py`; the multi-rank *atomic* output branch has
no direct gtest (covered indirectly by the mpirun per-atom-virial
assertion, since a single-process gtest can't set `nprocs>1`).


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Summary

* **New Features**
* Added support for graph-schema (NeighborGraph) model archives with a
selectable `lower_kind="graph"` export path, including CLI support and
new graph-form inference handling.
  * Added static edge-capacity support during graph construction.

* **Bug Fixes**
  * Improved gradient continuity for type embeddings in graph mode.
* Enhanced trace/export stability by preventing out-of-range graph
indices/frame IDs and making scatter/frame sizing more consistent.

* **Tests**
* Added/extended parity, export metadata, training, and LAMMPS
single-/multi-rank validation for graph-form `.pt2`, plus metadata
checks for `lower_input_kind`.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
## Problem

`DeepmdData.get_single_frame()` runs the data modifier through a one-off
`ThreadPoolExecutor` but never calls `future.result()`. The context
manager waits for the submitted task to finish, but any exception raised
inside `modifier.modify_data(...)` stays stored on the `Future` and is
never surfaced. As a result, frame-level data loading silently ignores
modifier failures: callers receive the unmodified frame, and when
caching is enabled that bad frame can be cached for future use. Other
code paths call the modifier directly and do propagate errors, so the
behavior was inconsistent.

## Fix

Call `future.result()` before leaving the modifier block so an exception
raised inside the modifier propagates instead of being swallowed (and
the unmodified frame cached).

## Test

A new test constructs a `DeepmdData` with a modifier whose `modify_data`
always raises, and asserts that `get_single_frame` re-raises the error
and does not cache the failed frame. On the current code the error is
swallowed (no exception, frame cached); after the fix the error
propagates.

Fix #5690

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved error handling when preparing a single frame so failures from
data modifiers are no longer hidden.
* Prevented invalid frames from being saved and reused after a modifier
error.
* **Tests**
* Added coverage to verify modifier failures are reported correctly and
do not populate the frame cache.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Han Wang <wang_han@iapcm.ac.cn>
## Summary
- Add backend-independent training abstractions under
`deepmd.dpmodel.train` for task/rank normalization, display scheduling,
learning-curve output, checkpoint cadence, lifecycle hooks, and shared
train entrypoint orchestration.
- Factor common training-data helpers so single-task training is handled
as a one-task collection and multi-task data
construction/summary/probability handling is shared where possible.
- Add a backend-independent finetune rule builder in
`deepmd.utils.finetune`, and reduce the PT, PT-exportable, Paddle, and
JAX backend finetune modules to backend-specific checkpoint loading plus
shared rule generation.
- Migrate JAX train entrypoint/trainer onto the shared pipeline and add
JAX finetune plus multi-task support on top of the new abstractions.
- Migrate `pt_expt` train entrypoint/trainer behavior further onto the
shared pipeline, including single-task-as-multi-task normalization, data
summaries, checkpoint retention, stat-file parent creation, relative
latest checkpoint symlinks, and checkpoint parent creation.
- Address PR review comments around task-key validation, learning-curve
metric ordering, lifecycle cleanup, `print_summary` fallback behavior,
broken `__len__` handling, JAX finetune branch/alias validation,
numeric-looking JAX task keys, HDF5 stat paths, and `pt_expt` checkpoint
symlinks.
- Move the new dpmodel trainer/entrypoint tests from
`source/tests/test_dpmodel_*.py` into `source/tests/common/dpmodel/`.

Refs #5229, #5230, #5231

## Tests
- `ruff format .`
- `ruff check .`
- `git diff --check`
- `PYTHONPATH=/home/jzzeng/codes/deepmd-kit pytest
source/tests/common/dpmodel/test_train_abstract_trainer.py
source/tests/common/dpmodel/test_train_entrypoint.py
source/tests/common/dpmodel/test_train_data.py
source/tests/common/dpmodel/test_training_utils.py
source/tests/common/test_finetune_utils.py
source/tests/jax/test_training.py
source/tests/pt_expt/test_entrypoint.py
source/tests/pt_expt/test_multitask.py::TestMultiTaskSeA::test_multitask_finetune
source/tests/pt_expt/test_multitask.py::TestMultiTaskSeA::test_multitask_finetune_from_single_task
source/tests/pt_expt/test_multitask.py::TestMultiTaskSeA::test_multitask_finetune_no_change_model_params
-q` (`53 passed, 2 subtests passed`)
- `PYTHONPATH=/home/jzzeng/codes/deepmd-kit timeout 180 srun
--gres=gpu:1 dp --jax train input.json --skip-neighbor-stat --finetune
pretrain.jax --use-pretrain-script` on a temporary 1-step water finetune
smoke; completed on NVIDIA GeForce RTX 5090 and saved `ft-model-1.jax`.
- `PYTHONPATH=/home/jzzeng/codes/deepmd-kit timeout 180 srun
--gres=gpu:1 dp --pt-expt train input.json --skip-neighbor-stat` on a
temporary 2-step water smoke; completed on NVIDIA GeForce RTX 5090,
saved `ckpts/pt-model-2.pt`, created `stats/stat.hdf5`, and verified
`ckpts/pt-model.pt -> pt-model-2.pt` with old step checkpoint pruned by
`max_ckpt_keep=1`.

## Notes
- Paddle-specific runtime tests were not run locally because `paddle` is
not installed in this environment.
- Plain PyTorch backend test collection is blocked in this environment
by external `deepmd_gnn`/CUDA initialization, not by the shared finetune
rule builder changes.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Introduced a unified, backend-independent training framework with
consistent single-task and multi-task handling, learning-curve output,
and structured training/validation steps.
* Added a common training entrypoint abstraction that standardizes
config normalization, neighbor-stat updates, and lifecycle teardown.
* Implemented full-validation with best-checkpoint tracking, top-K
selection, and `val.log` reporting (including backend-specific
checkpoint suffixes).

* **Bug Fixes**
* Improved checkpoint save/restore and retention (including “latest”
link updates and older checkpoint cleanup).
* Improved task-weighting logic to better handle datasets with/without
sizing information.
* Fixed multi-task neighbor-stat updates and JAX full-validation error
propagation across ranks.

* **Tests**
* Expanded unit and smoke tests for training orchestration, finetuning,
validation, and checkpoint reconciliation.

* **Documentation**
* Updated validation-configuration help text to reflect broader backend
support.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: njzjz-bot (driven by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5))[bot] <48687836+njzjz-bot@users.noreply.github.com>
## Summary

- Stop requesting the Read the Docs PDF output artifact.
- Keep the existing Sphinx HTML documentation build unchanged.

## Motivation

Read the Docs builds are currently timing out around the PDF generation
path. Removing the extra `formats: pdf` request should reduce build time
while preserving the main hosted documentation.

## Testing

- `git diff --check`

---
Submitted by OpenClaw 2026.6.8 (844f405)  
Authored by OpenClaw (model: custom-chat-jinzhezeng-group/gpt-5.5)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Removed PDF output from the documentation build, so published docs
will no longer include a downloadable PDF version.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.